1

static arrayクラスのプロパティに無名関数を格納しようとしています。これらの関数は、後でインデックスによって呼び出す必要がありますが、

self::$arr['index']()

ただ動作しませんが

$a = self::$arr['index'];
$a();

します!

これは機能しません:

class A {
    private static $func = array('a' => '');
    public function __construct() {
        self::$func['a'] = create_function('$str', 'echo "$str";');
    }
    public function go($str) {
        self::$func['a']($str);  // Call the function directly
    }
}
$a = new A();
$a->go("hooray");  // Outputs "Undefined variable: func"

しかし、これはします:

class A {
    private static $func = array('a' => '');
    public function __construct() {
        self::$func['a'] = create_function('$str', 'echo "$str";');
    }
    public function go($str) {
        $a = self::$func['a'];  // Pass the function name to a variable
        $a($str);               // Call the function via the variable
    }
}
$a = new A();
$a->go("hooray");  // Outputs "hooray"

なんで?

PHPバージョン5.4.3を使用しています

4

3 に答える 3

2

これはphpのパーサーの動作です

$functionName['a'] = "hello";
self::$functionName['a']();

呼び出し

self::hello();

...非常に悲しいことは、phpではこれを実行できないことです。

(self::$functionName['a'])(); // doesn't work in php :(

たとえば、JavaScriptでできるように

あなたができることは...あなたが言ったように一時変数を使うことです

$a = self::$func['a'];
$a($parameter);

また

call_user_func(self::$func['a'], $parameter);

お役に立てれば...


最新のphpでは、これらの機能が追加されました

$a['sss'] = function(){ echo 'bla'; };
$a['sss']();

class Bla
{
    private $a;
    function test()
    {
        $this->a['sss'] = function(){ echo 'bla2'; };
        $this->a['sss']();
    }
}
$c = new Bla();
$c->test();

そしてそれらは正しく動作します...したがって、何らかの理由で、この構文はスコープ解決演算子(ClassName :: self :: etc)を使用する場合にのみ機能しません。

于 2013-02-16T17:08:55.903 に答える
0

さて、phpではそれを行うことはできません。これはphpの機能です。call_user_funcただし、またはその親戚を使用できます。

return call_user_func(self::$func['$a'], $str);
于 2013-02-16T17:04:42.930 に答える
0

これは、PHPパーサーが現在どのように機能しているかの結果です。関数呼び出し()は静的演算子の前に評価されるため::、パーサーが代わりにローカル変数を参照しようとし、$func$ funcが未定義であるというエラーが発生します(これは$func、メソッドに名前が付けられた変数がないためです)。 )。

あなたが発見したように、あなたは2つの別々のステートメントを行うことによってこれを解決することができます。

于 2013-02-16T17:21:46.253 に答える