Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中允许链式调用方法吗?_Php_Magic Methods_Method Chaining - Fatal编程技术网

在PHP中允许链式调用方法吗?

在PHP中允许链式调用方法吗?,php,magic-methods,method-chaining,Php,Magic Methods,Method Chaining,例如,我有以下几点: class A{ __invoke(){ // return an instance of class A itself } } 那么,我可以做以下事情吗 new A()()()()... or (new A())()()()... 这里的解释是什么? 假设PHP版本高于5.4 好的,我可以再解释一下为什么我会问: 我使用的是一个开源HTMLDOM解析器ganon.php。 它使用类似于$html\u节点(“child\u标记”)的语法返回另一个子$ht

例如,我有以下几点:

class A{
  __invoke(){
    // return an instance of class A itself
  }
}
那么,我可以做以下事情吗

new A()()()()... or (new A())()()()...
这里的解释是什么? 假设PHP版本高于5.4

好的,我可以再解释一下为什么我会问: 我使用的是一个开源HTMLDOM解析器ganon.php。
它使用类似于$html\u节点(“child\u标记”)的语法返回另一个子$html\u节点,其中$html\u节点是类html\u节点的对象实例。因此,我在考虑是否可以使用链接在嵌套的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中:

A类{
公共函数调用($arg){
echo方法($arg)称为.PHP\u EOL;
}
}
$a=新的a();
$a(0);
$a(1)(2)(3);
A::\u调用(0)已调用
A::u调用(1)调用
致命错误:函数名必须是字符串
()

您可能对该功能感到困惑。如果
foo()
返回“bar”字符串,则
foo()()
等于
bar()

A类{
公共函数调用(){
返回“你好”;
}
}
函数hello($name){
echo“你好,$name!”.PHP_EOL;
}
$a=新的a();
$a()('Jim');
你好,吉姆! ()

只要函数返回更多具有有效函数名的字符串,就可以将其链接起来,但
\u invoke
或类都不起任何相关作用:

function one() {
    return 'two';
}

function two() {
    return 'three';
}

function three() {
    return 'four';
}

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

$a = one()()()();
完成!
()

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


根据UlrichEckhardt的评论进行更新:我忽略了返回类A实例本身的评论。如果您确实这样做了,那么代码确实可以工作:

()

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

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

我最讨厌的是:关于语言语法的问题,这些语法的特点是代码片段无效-好吧,要么你能,要么你不能,为什么不试试呢?也就是说,考虑使用FLUENT接口,或者应用Builder模式。这两种方法有点冗长,但也更清晰。只是想知道,你为什么要这样做?你的编辑完全改变了问题的意义。如果函数或方法返回一个对象,当然可以从该对象调用方法。你为什么不能?这与
\uu invoke()
无关。您不应该
返回$this在您最初的尝试中?否则返回的值是
null
,当然你不能调用
null
@UlrichEckhardt,因为我理解了(原始)问题,他不想要
foo()->bar()
但是
foo()()
。但我认为他实际上想要的是完全不同的东西,
\uu invoke()
在这里实际上是不相关的。我不确定最初的问题。但是,您的第一个
A级
并不能证明
$A(0)(1)
不起作用,因为
\u invoke()
应该返回
$this
(或者可以调用的其他内容)。这是不是上帝想要的并不重要。顺便说一句:尝试使用PHP5.4,
$a(0)(1)
给了我“PHP解析错误:语法错误,意外的'”(“在PHP外壳代码中”)@UlrichEckhardt-你的评论让我想知道我是否首先理解了这个问题。我刚刚更新了我的答案。
class A{
    public function __invoke($arg){
        echo __METHOD__ . "($arg) called" . PHP_EOL;
        return $this;
    }
}

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