是否允许在 PHP 中链接调用方法?

Is it allowed to chain invoke method in PHP?

例如,我有以下内容:

class A{
  __invoke(){
    // return an instance of class A itself
  }
}

那么我可以做以下事情吗?

new A()()()()... or (new A())()()()...

这里的解释是什么? 假设 PHP 版本比 5.4

更新

好的,我可以再多解释一下为什么我问: 我使用的是 ganon.php 这是一个开源的 html dom 解析器。 它使用类似 $html_node('child_tag') 的语法来 return 另一个 child $html_node 其中 $html_node 是一个 object class HTML_NODE 的实例。所以我在想是否可以使用链接在嵌套的 html dom 结构中进行选择。

对于 PHP 版本 7.0.0 - 7.0.4 你可以像

一样使用它
class A{
  public function __invoke($x){
    return __FUNCTION__."$x";
  }
}

echo (new A())(2);

输出:

__invoke2

我不认为你描述的行为实际上有效,即使在 PHP/7:

class A{
    public function __invoke($arg){
        echo __METHOD__ . "($arg) called" . PHP_EOL;
    }
}

$a = new A();
$a(0);
$a(1)(2)(3);
A::__invoke(0) called
A::__invoke(1) called
Fatal error: Function name must be a string

(demo)

您可能对 variable functions 功能感到困惑。如果 foo() return 是一个 'bar' 字符串,那么 foo()() 等于 bar():

class A{
    public function __invoke(){
        return 'hello';
    }
}

function hello($name) {
    echo "Hello, $name!" . PHP_EOL;
}

$a = new A();
$a()('Jim');
Hello, Jim!

(demo)

只要你的函数 return 更多具有有效函数名称的字符串,你就可以链接它,但 __invoke 和 class 都没有发挥任何相关作用:

function one() {
    return 'two';
}

function two() {
    return 'three';
}

function three() {
    return 'four';
}

function four() {
    echo 'Done!';
}

$a = one()()()();
Done!

(demo)

注意:以上所有代码片段都需要 PHP/7,但只需使用适当的括号和中间变量,就可以用早期版本模拟它们。


根据 UlrichEckhardt 的评论更新: 我忽略了 return class A 本身 评论的一个实例.如果您真的这样做了,代码 确实 有效:

class A{
    public function __invoke($arg){
        echo __METHOD__ . "($arg) called" . PHP_EOL;
        return $this;
    }
}

$a = new A();
$a(0);
$a(1)(2)(3);

class A{
    public function __invoke($arg){
        echo __METHOD__ . "($arg) called" . PHP_EOL;
        return $this;
    }
}

$a = new A();
$a(0);
$a(1)(2)(3);

(demo)

当然,这是PHP/7语法。对于旧版本,你需要辅助变量来打破魔法:

$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);