2011-08-10 6 views
4

phpでクラスのメンバ変数に格納されているコールバックを直接呼び出すことはできますか?私は一時的に自分のコールバックをローカル変数に保存している回避策を使っています。メンバー変数としてコールバックコール

class CB { 
    private $cb; 
    public function __construct($cb) { 
    $this->cb = $cb; 
    } 
    public function call() { 
    $this->cb(); // does not work 
    $cb = $this->cb; 
    $cb(); // does work 
    } 
} 

PHPは$this->cb()、すなわち存在しない、有効な方法ではないことを訴えます。

+0

同様の質問が尋ねたと答えました/ 1656151/php-callable-object-as-object-member)を参照してください。 Cliffノートのバージョン: "ほとんどの場合、入力がゆるんでいるため、実際に何をするのかを実際に推測する方法がないため、初期設定でエラーが発生することがデフォルトになります。" – Problematic

+0

おそらく '{$ this-> cb}()'ですか? '{}'はPHPに '$ cb'メンバ変数としてcb参照を見せ、オブジェクトのcbメソッドではないようにしなければなりません。 –

+0

marc、no、»unexpected {、expecting _something else_ ...« – knittl

答えて

3

あなたはcall_user_funcを使用する必要があります。

PHP7で
class CB { 
    private $cb; 
    public function __construct($cb) { 
     $this->cb = $cb; 
    } 
    public function call() { 
     call_user_func($this->cb, 'hi'); 
    } 
} 

$cb = new CB(function($param) { echo $param; }); 
$cb->call(); // echoes 'hi' 
+0

残念ですが、私はそれを直接呼び出すことはできませんが、 'call_user_func'を使う方法やローカル変数にコールバックを保存する方法はありません。 PHPパーサのようにかなり制限されているようです。 'call_user_func'はそれが得られるほど良いです、ありがとう! – knittl

1

あなたはこのようにそれを呼び出すことができます:[ここ](http://stackoverflow.com/questions

class CB { 
    /** @var callable */ 
    private $cb; 
    public function __construct(callable $cb) { 
    $this->cb = $cb; 
    } 
    public function call() { 
    ($this->cb)(); 
    } 
} 
関連する問題