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 ではプロパティ値をcallableとして直接使用することはできません。

このような callable を自動起動するために使用できるトリックもあります。私はそれを支持するかどうか確信が持てませんが、ここにあります。この実装をクラスに追加__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!");
     }
 }

これにより、callable を呼び出すことができるため、無料の関数を呼び出すことができます。

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

そしてクラスメソッド:

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

__callもちろん、呼び出しを微調整することで、この動作をカスタマイズできます。

于 2013-01-30T20:36:44.697 に答える
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()という名前のプロパティしかありません$_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」をプロパティとして誤って定義したと思いますか?

使用してみてください:

private function _auto(){}

それ以外の

private $_auto
于 2013-01-30T20:51:21.580 に答える