采用以下两个类的示例:
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()
答案 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();
如果被调用的方法存在并且它实际上是可调用的,那么首先检查它可能是个好主意。
但这个例子可以作为概念证明。