【问题标题】:Using array_push with closures overwriting previous element使用带有闭包的 array_push 覆盖前一个元素
【发布时间】:2013-06-02 04:28:11
【问题描述】:

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

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。两者都不起作用。

【问题讨论】:

  • 向我们展示您实际上是如何执行代码并检查您的假设的。目前我们只看到它的定义。
  • 你尝试使用$this->array[] = $function
  • @deceze 好了。
  • 好的,我刚开始收到错误Can't use function return value in write context。我怎样才能解决这个问题? 编辑 这实际上只是我刚刚犯的一个语法错误。我修复了它,但现在整个代码都无法正常工作......
  • 您在赋值的左侧有一个函数调用,例如foo() = bar。修复它。

标签: php arrays callback closures array-push


【解决方案1】:

刚刚在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

对我来说似乎工作正常

【讨论】:

  • 类中是否还有其他方法正在修改数组?
  • 使用此类的代码是否有可能创建新实例而不是重用当前实例?
  • 不,我有在一个文件中创建对象的代码,然后它包含几个文件,每个文件都执行$bacon->AddBacon()。然后,我在原始文件中运行$bacon->GetBacon()
  • 如何将$bacon 变量提供给其他文件?
  • 而且您确定在其他任何文件中都没有类似 $bacon = new BaconClass(); 的内容
猜你喜欢
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 2014-03-30
相关资源
最近更新 更多