1

私はphp 5.4でこれが可能だと思った

(new object())->method();

しかし、オブジェクトとメソッドの両方がクラス変数に格納されていると問題が発生します。次のことを試しました。

new $this->object($this->params)->$this->method();
new ($this->object($this->params))->$this->method();
new $this->object($this->params)->{$this->method}();

私が間違っていて実行できない場合を除いて、私はそれを機能させることができないようです。ありがとうございました

4

1 に答える 1

3

このテスト ( http://codepad.viper-7.com/mcPvpG ) (更新されたテスト) に基づいてnew object()、 を独自の()でラップし、メソッド名を でラップすると動作するはずです{}new object()単なるコンストラクターの呼び出しではなく、オブジェクトを返すのは式であるためobject()、その式は としてラップする必要があります()

ただし、これは非常に複雑です。このことを再考する機会があれば、私はそうしたいと思います。

public $object = 'ClassName';
public $method = 'method';

// Called as:
(new $this->object($this->params))->{$this->method}();

を使用した例を次に示しArrayIterator::valid()ます。

class instantiator {
    public $object = "ArrayIterator";
    public $method = "valid";
    public $params = array(1,2,3);

    public function do_it() {
        var_dump((new $this->object($this->params))->{$this->method}());
    }
}

$i = new instantiator();
$i->do_it();
// Prints bool(true)
于 2013-03-03T19:09:47.243 に答える