35

リスナークラスを作成したい

class Listener {
    var $listeners = array();
    
    public function add(callable $function) {
        $this->listeners[] = $function;
    }

    public function fire() {
        foreach($this->listeners as $function) {
            call_user_func($function);
        }
    }
}

class Foo {
    public function __construct($listener) {
        $listener->add($this->bar);
    }
    
    public function bar() {
        echo 'bar';
    }
}



$listener = new Listener();
$foo = new Foo($listener);

しかし、このコードはこのエラーで失敗します:

注意:未定義のプロパティ:18行目のindex.phpのFoo :: $ bar

キャッチ可能な致命的なエラー:Listener :: add()に渡される引数1は呼び出し可能で、nullが指定され、18行目のindex.phpで呼び出され、5行目でindex.phpが定義されている必要があります

私は何が間違っているのですか?

4

3 に答える 3

39
  • PHP 5.4より前は、という名前の型はありませんでしたcallable。したがって、これを型のヒントとして使用すると、「という名前のクラス」を意味しcallableます。PHP> = 5.4を使用する場合、callableは有効なヒントです。

  • 呼び出し可能オブジェクトは、呼び出し可能オブジェクトの名前(関数名やクラスメソッド名など)を表す文字列、または最初の要素がオブジェクトのインスタンスで、2番目の要素がメソッドの名前である配列によって指定されます。と呼ばれる。

PHP <5.4の場合、置換

public function add(callable $function)

と:

public function add($function)

それを呼び出す:

$listener->add(array($this, 'bar'));
于 2012-11-24T16:46:38.783 に答える
11

PHPでは、メソッドとプロパティに別々の名前空間があります。そのため、次の$this->barように評価されnullます。未定義のプロパティにアクセスしています

次の形式で配列を作成する正しい方法array($object, "methodName")

コールバックを正しく渡す:

$listener->add(array($this, 'bar'));  

あなたが与えたタイプヒントは大丈夫です— PHP 5.4の時点で、つまり。

于 2012-11-24T16:48:52.210 に答える
3

この方法で呼び出し可能オブジェクトを指定することはできないと思います...

試す

$listener->add(array($this, 'bar'));

また、 http://php.net/manual/en/language.types.callable.phpも参照してください。

于 2012-11-24T16:39:01.333 に答える