我正在尝试调用存储为$_auto
的方法,但它无效。
<?php
class Index {
private $_auto;
public function __construct() {
$this->_auto = "index";
$this->_auto();
}
public function index() {
echo "index";
}
}
$index = new Index();
?>
答案 0 :(得分:2)
您需要使用call_user_func
来执行此操作:
call_user_func(array($this, $this->_auto));
不幸的是,PHP不允许您直接将属性值用作callables。
还有一个技巧可以用来像这样自动调用callables。我不确定我会认可它,但现在就是这样。将此__call
的实现添加到您的班级:
public function __call($name, $args)
{
if (isset($this->$name) && is_callable($this->$name)) {
return call_user_func_array($this->$name, $args);
}
else {
throw new \Exception("No such callable $name!");
}
}
这将允许您调用callables,因此您可以调用自由函数:
$this->_auto = 'phpinfo';
$this->_auto();
和班级方法:
$this->_auto = array($this, 'index');
$this->_auto();
当然,您可以通过调整__call
调用的内容来自定义此行为。
答案 1 :(得分:0)
您没有名为_auto()
的方法,您只有一个名为$_auto
的属性。如果您的意图是调用未定义的方法来返回一个类似命名的属性(如果它存在),那么您需要编写一个__call()
魔术方法来执行查看类似命名属性并返回值的逻辑。所以这样的东西需要添加到你的班级中:
public function __call($called_method, $arguments) {
if(property_exists($this, $called_method)) {
return $this->{$called_method};
} else {
throw new Exception('Illegal method call.');
}
}
答案 2 :(得分:0)
您的代码正在尝试调用名为“_auto”的方法。要做你想要的,你想让方法名称成为一个php变量,或者其他海报所说的那些。
class Foo {
private function _auto() {
echo "index";
}
public function callmethod($method) {
$this->$method();
}
}
$foo = new Foo();
$foo->callmethod('_auto');
答案 3 :(得分:0)
我认为您错误地将“_auto”定义为属性?
尝试使用:
private function _auto(){}
而不是
private $_auto