gpt4 book ai didi

php - 为什么 PHP `__invoke` 在从对象属性触发时不起作用

转载 作者:行者123 更新时间:2023-12-03 18:46:30 32 4
gpt4 key购买 nike

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

class Foo {
public function __toString() {
return '`__toString` called.';
}
public function __get($key) {
return '`__get(' . $key . ')` called.';
}
public function __invoke($x = "") {
return '`__invoke(' . $x . ')` called.';
}
}

然后像这样在对象属性中创建一个实例:

$object = (object) [
'foo' => 'bar',
'baz' => new Foo
];

然后测试一下:

echo $object->baz;
echo $object->baz->qux;
echo $object->baz('%'); // :(

在最后一个回显中被打破:Call to undefined method stdClass::baz()

目前,我能做的唯一解决方案是将 __invoke 部分存储在一个临时变量中,然后将该变量作为这样的函数调用:

$x = $object->baz;
echo $x('%'); // :)

当我在数组属性中实例化类时它工作正常:

$array = [
'baz' => new Foo
];

echo $array['baz'];
echo $array['baz']->qux;
echo $array['baz']('%'); // :)

顺便说一句,我的对象需要这种能力来处理与 API 相关的事情:

$foo = (object) ['bar' => new MyClass];
  • echo $foo->bar; → 应该触发 __toString
  • echo $foo->bar->baz; → 应该触发 __get
  • echo $foo->bar(); → 应该触发 __invoke
  • echo $foo->bar->baz(); → 应该触发 __call

它们都应该返回一个字符串。

这可以完全在 PHP 中完成吗?谢谢。

最佳答案

没办法。

有问题的行只是模棱两可,错误消息告诉您如何...尝试访问 baz() 更合乎逻辑你的方法$object对象。
这只是解析器在看到 $object->baz() 时给出的上下文。

正如评论中已经提到的,您可以消除这种歧义,通过告诉解析器 $object->baz 来帮助解析器。本身就是一个需要先执行的表达式:

($object->baz)('arg');

PHP 本身也是一个程序,在执行之前必须知道如何执行某些内容。如果它可以在 $foo->bar->baz->qux 中的每个对象上盲目尝试所有可能的“魔术”方法链,那么它就无法在遇到错误时告诉你错误是什么——它只会默默地崩溃。

关于php - 为什么 PHP `__invoke` 在从对象属性触发时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41460662/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com