使用带闭包的array_push覆盖前一个元素

时间:2013-06-06 08:39:39

标签: php arrays callback closures array-push

我有一个奇怪的问题。我正在编写一个类似于回调的系统,其中一些代码调用类中的函数,该函数将函数添加到数组中,然后再执行它。这是我的代码:

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查看数组内部的内容后,它总是会有效显示一个对象,它始终是最新添加的对象。

为什么代码会覆盖前一个元素?如果有更好的方法来实现此代码,我愿意接受建议。

我尝试了什么

我已尝试使用$this->array[] = $function,我也尝试使用$this->array[count($this->array)] = $function。两者都没有工作。

1 个答案:

答案 0 :(得分: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

似乎对我很好