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