3

クラスがあり、動的に作成された関数 (「create_function」を介して作成) がありますが、この関数をこのクラス (クラス関数) に対してのみ作成することを PHP に伝える方法が見つかりません。そのため、新しい関数はオブジェクト プロパティにアクセスできません。次のコードを見てください。

class Test {
  private $var=1;

  function __construct() {
      call_user_func(create_function('', 'echo $this->var;'));
  }
}

new Test;

これにより、「致命的なエラー: D:\WWW\index.php(7) のオブジェクト コンテキストにないときに $this を使用しています: 行 1 のランタイムで作成された関数」というエラーがスローされます。

4

2 に答える 2

4

あなたはおそらくrunkit_method_add、そうではありませんcreate_function

于 2012-10-04T19:24:40.813 に答える
3

PHP 5.4 の時点で、anonymus 関数も$thisそのコンテキストに含まれています。マジック メソッドの助けを借りて、_callコードを追加せずにクロージャをメソッドとしてクラスに追加できます。

class Test
{
  private $var = 1;

  function __construct()
  {
    $this->sayVar = function() { echo $this->var; };
  }

  public function __call( $method, $args )
  {
    if ( property_exists( $this, $method ) ) {
      if ( is_callable( $this->$method ) ) {
        return call_user_func_array( $this->$method, $args );
      }
    }
  }

}

$test = new Test();
$test->sayVar(); // echos 1
于 2012-10-04T19:25:15.513 に答える