如何调用公共财产的对象

时间:2017-12-15 23:33:14

标签: php

采用以下两个类的示例:

class Yolo {
    public function __invoke() {
        echo 'YOLO';
    }
}

class Swag {
    public $yolo;
    public function __construct() {
        $this->yolo = new Yolo();
    }
}

是否可以通过Yolo的实例调用Swag对象? (new Swag())->yolo();发出警告,但未拨打__invoke

  

PHP警告:未捕获错误:调用未定义的方法Swag :: yolo()

3 个答案:

答案 0 :(得分:3)

在PHP 7中,您可以直接调用它(只需要额外的大括号):

((new Swag())->yolo)();

在PHP 5中,您需要一个临时变量:

$y=(new Swag())->yolo;
$y();

答案 1 :(得分:1)

问题是您尝试在Swag类上调用函数yolo()。在您的情况下,您必须使用公共类变量并调用该子类。

var_dump((new Swag())->yolo);

这是你的对象。当您使用()时,您尝试调用类而不是类变量。

答案 2 :(得分:1)

您甚至不必将其作为公共方法。 但是您可能必须手动重新路由调用,因为在运行时创建了可调用方法:

class Yolo {
    public function __invoke() {
        echo 'YOLO';
    }
}

class Swag {
    private $yolo;
    public function __construct() {
        $this->yolo = new Yolo();
    }

    function __call($method, $args) {
          if(is_callable($this->$method))
          {
            return call_user_func_array($this->$method, $args);
          }
     }
}


(new Swag())->yolo();

如果被调用的方法存在并且它实际上是可调用的,那么首先检查它可能是个好主意。

但这个例子可以作为概念证明。