0

奇妙な問題があります。一部のコードがクラス内の関数を呼び出し、関数を配列に追加してから後で実行する、コールバックのようなシステムを作成しています。これが私のコードです:

class BaconClass {
    private $array;

    public function __construct() {
        $this->array = array();
    }

    public function AddBacon($function) {
        array_push($this->array, $function);
    }

    /* ... */

    public function GetBacon() {
        foreach($this->array as $function) {
            echo $function();
        }
    }
}

次に、次のような他のコードがあります。

$bacon = new BaconClass();
$bacon->AddBacon(function() {
    echo "Om nom nom";
});

/* And somewhere else I might have */

$bacon->AddBacon(function() {
    echo "I like bacon";
});

/* And then after all of this I have */
$bacon->GetBacon();

このコードは以下のみを出力します:

I like bacon

関数に渡される配列AddBaconが実際に機能していることを確認しましたがvar_dump、要素を追加した後に配列の内容を確認するために使用すると、常に 1 つのオブジェクトが表示されます。これは常に最後に追加されたものです。

コードが前の要素を上書きするのはなぜですか? このコードを実装するためのより良い方法があれば、提案をお待ちしています。

私が試したこと

を使ってみました$this->array[] = $functionが、 も使ってみ$this->array[count($this->array)] = $functionました。どちらも機能していません。

4

1 に答える 1

0

提供されたコードをphpコンソールでテストしたところ、この出力が得られました。

class BaconClass {
    private $array;

    public function __construct() {
        $this->array = array();
    }

    public function AddBacon($function) {
        array_push($this->array, $function);
    }

    /* ... */

    public function GetBacon() {
        foreach($this->array as $function) {
            echo $function();
        }
    }
}
$bc = new BaconClass();
$bc->AddBacon(function() {echo 'something'; });
$bc->AddBacon(function() {echo 'something else'; });
$bc->GetBacon();
// outputs: somethingsomething else

私にはうまくいっているようです

于 2013-06-06T08:44:44.953 に答える