2013-06-06 17 views
0

我有一个奇怪的问题。我正在写一个类似回调的系统,其中一些代码在一个类中调用一个函数,该函数将该函数添加到数组中,然后再执行它。这里是我的代码:使用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来查看数组里面到底是什么元素后,它总是显示一个对象,它总是最新的o ne补充说。

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

我已经试过

我一直在使用$this->array[] = $function尝试过了,我一直在使用$this->array[count($this->array)] = $function也试过。都没有工作。

+0

告诉我们如何你实际上* *执行的代码,并检查你的假设。目前我们只看到它的定义。 – deceze

+0

你尝试使用'$ this-> array [] = $ function' – DevZer0

+0

@ DevZer0是的,我确实使用了 – cpdt

回答

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 

似乎是工作的罚款,我

+0

奇怪..也许这是我的代码的另一部分.. – cpdt

+0

该类中有任何其他方法正在修改数组? – Pudge601

+0

不,没有。 – cpdt