首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否允许在PHP中链接调用方法?

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

Stack Overflow用户
提问于 2016-03-23 09:45:02
回答 2查看 215关注 0票数 6

例如,我有以下几点:

代码语言:javascript
复制
class A{
  __invoke(){
    // return an instance of class A itself
  }
}

我能做以下几件事吗?

代码语言:javascript
复制
new A()()()()... or (new A())()()()...

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

好的,我可能会给出更多的解释,为什么我会问:我使用的是ganon.php,这是一个开源的html解析器。它使用像$html_node('child_tag')这样的语法返回另一个子$html_node,其中$html_node是类HTML_NODE的对象实例。因此,我在想,是否可以使用链接在嵌套的html多姆结构中进行选择。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-23 10:34:33

我不认为您所描述的行为实际有效,甚至在PHP/7中也是如此:

代码语言:javascript
复制
class A{
    public function __invoke($arg){
        echo __METHOD__ . "($arg) called" . PHP_EOL;
    }
}

$a = new A();
$a(0);
$a(1)(2)(3);
代码语言:javascript
复制
A::__invoke(0) called
A::__invoke(1) called
Fatal error: Function name must be a string

(演示)

您可能对可变函数特性感到困惑。如果foo()返回'bar‘字符串,那么foo()()等于bar()

代码语言:javascript
复制
class A{
    public function __invoke(){
        return 'hello';
    }
}

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

$a = new A();
$a()('Jim');
代码语言:javascript
复制
Hello, Jim!

(演示)

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

代码语言:javascript
复制
function one() {
    return 'two';
}

function two() {
    return 'three';
}

function three() {
    return 'four';
}

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

$a = one()()()();
代码语言:javascript
复制
Done!

(演示)

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

基于UlrichEckhardt的评论的更新:我忽略了返回A类本身的一个实例注释。如果您真的这样做,代码就会起作用:

代码语言:javascript
复制
class A{
    public function __invoke($arg){
        echo __METHOD__ . "($arg) called" . PHP_EOL;
        return $this;
    }
}

$a = new A();
$a(0);
$a(1)(2)(3);
代码语言:javascript
复制
class A{
    public function __invoke($arg){
        echo __METHOD__ . "($arg) called" . PHP_EOL;
        return $this;
    }
}

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

(演示)

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

代码语言:javascript
复制
$a = new A();
$b = $a(1);
$c = $b(2);
$d = $c(3);
$d(4);
票数 4
EN

Stack Overflow用户

发布于 2016-03-23 09:59:23

对于PHP版本的7.0.0 - 7.0.4,您可以如下所示

代码语言:javascript
复制
class A{
  public function __invoke($x){
    return __FUNCTION__."$x";
  }
}

echo (new A())(2);

输出:

代码语言:javascript
复制
__invoke2
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36174623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档