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

时间:2016-03-23 09:45:02

标签: php magic-methods method-chaining

例如,我有以下内容:

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')的语法来返回另一个子$ html_node,其中$ html_node是类HTML_NODE的对象实例。所以我在想是否可以使用链接在嵌套的html dom结构中进行选择。

2 个答案:

答案 0 :(得分:4)

对于PHP版本BsonClassMap.RegisterClassMap<GroceryList>(cm => { cm.AutoMap(); cm.UnmapMember(m => m.IsOwner); }); ,您可以像

一样使用它
7.0.0 - 7.0.4

<强>输出:

class A{
  public function __invoke($x){
    return __FUNCTION__."$x";
  }
}

echo (new A())(2);

答案 1 :(得分:4)

我认为您描述的行为实际上并不起作用,即使在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()返回“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

只要函数返回带有效函数名称的更多字符串,就可以链接它,但__invoke和类都不起任何相关作用:

function one() {
    return 'two';
}

function two() {
    return 'three';
}

function three() {
    return 'four';
}

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

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

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);

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);