我想知道这是错误还是正常。假设我有一类具有一些神奇功能的类:
class Foo {
public function __toString() {
return '`__toString` called.';
}
public function __get($key) {
return '`__get(' . $key . ')` called.';
}
public function __invoke($x = "") {
return '`__invoke(' . $x . ')` called.';
}
}
Run Code Online (Sandbox Code Playgroud)
然后在对象属性中创建一个实例,如下所示:
$object = (object) [
'foo' => 'bar',
'baz' => new Foo
];
Run Code Online (Sandbox Code Playgroud)
然后测试一下:
echo $object->baz;
echo $object->baz->qux;
echo $object->baz('%'); // :(
Run Code Online (Sandbox Code Playgroud)
在最后一个回声中它被打破了: Call to undefined method stdClass::baz()
当前,我唯一能做的解决方案是将__invoke零件存储在一个临时变量中,然后将该变量作为如下函数调用:
$x = $object->baz;
echo $x('%'); // :)
Run Code Online (Sandbox Code Playgroud)
当我在array属性中实例化该类时,它可以正常工作:
$array = …Run Code Online (Sandbox Code Playgroud) 对于 JavaScript,我们可以这样做,将作用域绑定到所需的函数:
\nfunction myFunction() {\n alert(this.foo);\n}\n\nvar MyClass = function () {\n this.foo = 1;\n};\n\nvar c = new MyClass();\nmyFunction.call(c); // `1`\nRun Code Online (Sandbox Code Playgroud)\n我想使用 PHP 做同样的事情。目前,我所看到的成功工作是这样的,但这仅适用于匿名函数:
\n$my_function = function () {\n var_dump($this->foo);\n};\n\nclass MyClass {\n public $foo = 1;\n};\n\n$c = new MyClass();\nClosure::bind($my_function, $c)();\n\n// Or\xe2\x80\xa6\n// $my_function->call($c);\nRun Code Online (Sandbox Code Playgroud)\n这不起作用:
\nfunction my_function() {\n var_dump($this->foo);\n}\n\nclass MyClass {\n public $foo = 1;\n};\n\n$c = new MyClass();\nClosure::bind('my_function', $c)(); // :(\ncall_user_func([$c, 'my_function']); // :(\nRun Code Online (Sandbox Code Playgroud)\n