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

前端之家收集整理的这篇文章主要介绍了是否允许在PHP中链接调用方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
例如,我有以下内容
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@

猜你在找的PHP相关文章