小编Tau*_*man的帖子

为什么从对象属性触发时PHP`__invoke`无法正常工作

我想知道这是错误还是正常。假设我有一类具有一些神奇功能的类:

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)

php

2
推荐指数
1
解决办法
586
查看次数

如何将 `$this` 绑定到 PHP 函数?

对于 JavaScript,我们可以这样做,将作用域绑定到所需的函数:

\n
function myFunction() {\n    alert(this.foo);\n}\n\nvar MyClass = function () {\n    this.foo = 1;\n};\n\nvar c = new MyClass();\nmyFunction.call(c); // `1`\n
Run 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);\n
Run Code Online (Sandbox Code Playgroud)\n

这不起作用:

\n
function 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']); // :(\n
Run Code Online (Sandbox Code Playgroud)\n

php oop closures

2
推荐指数
1
解决办法
2971
查看次数

标签 统计

php ×2

closures ×1

oop ×1