从字符串调用类方法存储为类成员(Calling class method from string s

2019-10-17 15:33发布

我试图调用存储的方法$_auto ,但它不会工作。

<?php
    class Index {
        private $_auto;

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

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

    $index = new Index();
?>

Answer 1:

您需要使用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调用。



Answer 2:

你的代码试图调用一个名为“_auto”的方法。 要做到你的要求,你想方法名沿其他海报所说的话的线条一个PHP变量或东西。

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

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

$foo = new Foo();
$foo->callmethod('_auto');


Answer 3:

你不会有一个名为方法_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.');
    }
}


Answer 4:

我想你误定义“_auto”作为财产?

尝试使用:

private function _auto(){}

代替

private $_auto


文章来源: Calling class method from string stored as class member