0
echo System\Core\Request::factory()->execute();

ここでは factory() が最初に呼び出され、コンストラクターが次に呼び出され、execute() が最後に呼び出されます。もちろん、期待どおりに機能します。

リクエスト クラスには、いくつかの非静的属性が含まれています。それらすべてをファクトリーメソッドで設定しました。このような:

public static function factory()
{
   if(! Request::$initial)
   {
      $request = Request::$initial = Request::$current = new Request();
      $request->foo = 'bar';
   }
   else
   {
      Request::$current = $request = new Request();
      $request->foo = 'aaa';
   }
   return Request::$current;
}

コンストラクターは次のようになります。

public function __construct()
{
   echo $this->foo; // displays empty string
   echo Request::$current->foo; // trying to get property of non-object
}

何が起こっている?

4

1 に答える 1

2

コンストラクターはfoo、リクエストをインスタンス化した後にファクトリーで設定するため、設定する前に呼び出されます。

public static function factory()
{
   if(! Request::$initial)
   {
      // constructor is called as part of this line
      $request = Request::$initial = Request::$current = new Request();

      // foo is set AFTER the constructor is called
      $request->foo = 'bar';
   }
   else
   {
      // constructor is called as part of this line
      Request::$current = $request = new Request();

      // foo is set AFTER the constructor is called
      $request->foo = 'aaa';
   }
   return Request::$current;
}
于 2013-05-16T19:27:08.147 に答える