1

我正在尝试调用存储为的方法$_auto,但它不起作用。

<?php
    class Index {
        private $_auto;

        public function __construct() {
            $this->_auto = "index";
            $this->_auto();
        }

        public function index() {
            echo "index";
        }
    }

    $index = new Index();
?>
4

4 回答 4

2

您需要使用call_user_func来执行此操作:

call_user_func(array($this, $this->_auto));

不幸的是,PHP 不允许您直接将属性值用作可调用对象

还有一个技巧可以用来自动调用这样的可调用对象。我不确定我会支持它,但它就是这样。将此实现添加__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!");
     }
 }

这将允许您调用可调用对象,因此您可以调用自由函数:

 $this->_auto = 'phpinfo';
 $this->_auto();

和类方法:

 $this->_auto = array($this, 'index');
 $this->_auto();

当然,您可以通过调整__call调用的内容来自定义此行为。

于 2013-01-30T20:36:44.697 回答
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.');
    }
}
于 2013-01-30T20:37:20.100 回答
0

您的代码试图调用一个名为“_auto”的方法。要按照您的要求进行操作,您希望将方法名称设为 php 变量或其他海报所说的内容。

class Foo {
    private function _auto() {
        echo "index";
    }

    public function callmethod($method) {
        $this->$method();
    }
}

$foo = new Foo();
$foo->callmethod('_auto');
于 2013-01-30T20:41:19.420 回答
0

我认为您错误地将“_auto”定义为属性?

尝试使用:

private function _auto(){}

代替

private $_auto
于 2013-01-30T20:51:21.580 回答