我有一个类Logger
,其中有一个方法Log
。
由于Log
是Logger
示例的最常见用法,因此我将__invoke
连接起来调用Log
另一个类“Site”包含成员“Log”,它是Logger的示例。
为什么会这样:
$Log = $this->Log;
$Log("Message");
但不是这个:
$this->Log("Message");
前一个失败,并显示“PHP Fatal error:调用未定义的方法Site::Log()”
这是可调用对象实现的一个限制,还是我误解了什么?
5条答案
按热度按时间w8biq8rn1#
不幸的是,这(仍然)是PHP的一个限制,但当你考虑它时,它是有意义的,因为类可以包含共享名称的属性和方法。例如:
如果PHP允许你想要的语法,哪个函数会被调用?不幸的是,这只剩下
call_user_func[_array]()
(或者将$this->log
复制到另一个变量并调用它)。但是,如果以下语法是可接受的,那就更好了:
但可惜的是,它不是。
mfuanj7w2#
和你不能这么做的原因一样
$value = $this->getArray()["key"];
甚至这个
$value = getArray()["key"];
因为PHP语法不能很好地进行速记。
7cwmlq893#
这可能会起作用:
但也许使用完整的调用更容易,更好?似乎没有一种方法可以在一条线上得到你想要的工作。
你的问题中的错误表明它正在寻找一个在不存在的类上定义的函数。一个可调用的对象不是一个函数,在这种情况下,它似乎不能被视为一个函数。
zzlelutf4#
下面的代码是为我工作的
8yoxcaq75#
谢谢你的问题和所有的答案!我将分享我的经验,以防它对这个问题上的人有用。
我喜欢这样定义一个调试函数,当调试标志打开时,程序会向我描述它在做什么,当我写代码时,我会添加很多日志记录,因为这是我最清楚哪些情况可能存在的时候。然后当debug flag为off时,除了布尔检查之外,几乎没有开销成本,因为只有在debug为on的情况下才会调用函数(并评估参数)。
我在其他语言中以不同的方式使用它,在PHP中,我首先这样写:
但它将是全局范围内的:
我不想添加全局变量,因为全局变量不能放在名称空间下。因此,在检查了命名空间中可以包含的内容之后,我在一个类中定义了它:
但它给了我同样的“未初始化”警告这个线程说,并没有工作!
感谢这个帖子和Norbert瓦格纳的推荐,我尝试了括号,它工作了!我不需要在布尔检查中添加它,只需要在调用中添加它,现在代码看起来像这样并且可以工作: