我正在尝试从另一个类中实例化PHP中的类,以及调用所述类的方法,但无论我做什么,我都会收到错误。
为什么以下不起作用:
class Example {
public function sayHi () {
echo "hi";
}
}
class Caller {
private $_controller,
$_action;
public function __construct ($cont, $action) {
$this->_controller = $cont;
$this->_action = $action;
}
public function __toString() {
return (string)$this->_action;
}
public function run () {
$controller = new $this->_controller;
if (is_callable(array($controller, $this->_action))) {
$controller->$this->_action;
}
}
}
$caller = new Caller ('Example', 'sayHi');
$caller->run();
将方法运行更改为以下作品?
public function run () {
$controller = new $this->_controller;
if (is_callable(array($controller, $this->_action))) {
call_user_func(array($this->_controller, $this->_action));
}
}
我不想要call_user_func的原因是因为它静态调用控制器。
删除魔术方法__toString给了我:
Catchable fatal error: Object of class Caller could not be converted to string
再次添加它会给我以下内容:
Undefined property: Example::$sayHi (same line, on method run() from Caller)
Trying to get property of non-object (same line, on method run() from Caller)
答案 0 :(得分:4)
这一行是你的问题:
$controller->$this->_action;
这里有几个问题。首先,你最后没有表示你正在调用方法的parens。 PHP认为您正在尝试访问属性。
其次,您希望首先获取$this->_action
的值,然后将该值动态地用作方法名称。使用花括号将其分开。
将该行更改为:
$controller->{$this->_action}();
答案 1 :(得分:2)
你是对的。如果您只是将类名称和函数传递给call_user_func
,它将静态调用它。但是如果你将一个实例传递给它,它将在该实例中调用它。这就是callable的原因。