例如,我有以下内容:
class A{ __invoke(){ // return an instance of class A itself } }@H_301_2@我可以这样做吗?
new A()()()()... or (new A())()()()...@H_301_2@这是什么解释?
假设PHP版本比5.4更新好的,我可以再解释一下为什么我要问:
我正在使用ganon.PHP这是一个开源的html dom解析器.
它使用类似$html_node(‘child_tag’)的语法来返回另一个子$html_node,其中$html_node是类HTML_NODE的对象实例.所以我在想是否可以使用链接在嵌套的html dom结构中进行选择.
我不认为您描述的行为实际上有效,即使在PHP / 7中:
class A{ public function __invoke($arg){ echo __METHOD__ . "($arg) called" . PHP_EOL; } } $a = new A(); $a(0); $a(1)(2)(3);@H_301_2@A::__invoke(0) called A::__invoke(1) called Fatal error: Function name must be a string@H_301_2@(demo)
您可能对variable functions功能感到困惑.如果foo()返回’bar’字符串,则foo()()等于bar():
class A{ public function __invoke(){ return 'hello'; } } function hello($name) { echo "Hello,$name!" . PHP_EOL; } $a = new A(); $a()('Jim');@H_301_2@Hello,Jim!@H_301_2@(demo)
只要函数返回带有效函数名的更多字符串,您就可以链接它,但__invoke和类都不起任何相关作用:
function one() { return 'two'; } function two() { return 'three'; } function three() { return 'four'; } function four() { echo 'Done!'; } $a = one()()()();@H_301_2@Done!@H_301_2@(demo)
注意:上面的所有代码片段都需要PHP / 7,但只需使用适当的括号和中间变量就可以使用早期版本进行模拟.
根据UlrichEckhardt的评论更新:我忽略了返回A类本身评论的实例.如果你真的这样做,代码确实有效:
class A{ public function __invoke($arg){ echo __METHOD__ . "($arg) called" . PHP_EOL; return $this; } } $a = new A(); $a(0); $a(1)(2)(3);@H_301_2@class A{ public function __invoke($arg){ echo __METHOD__ . "($arg) called" . PHP_EOL; return $this; } } $a = new A(); $a(0); $a(1)(2)(3);@H_301_2@(demo)
当然,这是PHP / 7语法.对于旧版本,您需要具有突破魔力的辅助变量:
$a = new A(); $b = $a(1); $c = $b(2); $d = $c(3); $d(4);@H_301_2@