【问题标题】:Foreach loop which results in object instantiation导致对象实例化的 Foreach 循环
【发布时间】:2011-03-24 05:29:40
【问题描述】:

我需要接受表格中选中项目的数组,并根据已选择的项目更新字段。最初我的想法是在哪里简单地遍历数组中的每个项目并访问特定类中的函数来更新状态。

我有点担心这种方法,因为它意味着为循环的每次迭代实例化一个对象以更新相关状态。

foreach($example as $exampleId){
    $newExample=new Example($exampleId);
    $newExample->updateStatus('active');
}

有没有更好的方法来解决这个问题?这似乎是一种不好的做法,但我正在努力寻找替代方法。

【问题讨论】:

    标签: php oop object foreach instantiation


    【解决方案1】:

    这是一个选项吗?

    $newExample=new Example();
    foreach($example as $exampleId){
        $newExample->updateStatus($exampleId,'active');
    }
    

    否则你总是可以这样做:

    foreach($example as $exampleId){
        $newExample=new Example($exampleId);
        $newExample->updateStatus('active');
        $newExample->__destruct(); 
        unset($newExample);
    }
    

    为此,你需要在你的类中使用另一个方法

    $newExample=new Example();
    foreach($example as $exampleId){
        $newExample->set_example_id($exampleId);
        $newExample->updateStatus('active');
    }
    

    【讨论】:

    • 嗯,并不是因为我的构造函数最初接受 $exampleId 以预填充某些属性。 $newExample::updateStatus() 将使用 $newExample->exampleId 来确定要更新的相关数据库记录。感谢您的意见。
    • 为您提供了另一种选择,请查看是否适合您
    • 看起来不错,我会假设这会破坏之前的对象吗?尽管如此,我还是会为每个实例化进行大量的数据库调用。
    • 是的,它应该销毁最新的对象,你想在更新状态方法中做什么?我会在一秒钟内添加另一种可能性
    • 这当然是真的,但每次都实例化你的类不是:P 也许你可以让我知道你在你的类构造函数中做了什么
    【解决方案2】:

    听起来创建对象有开销,因为它是从数据库或其他地方加载的?您能否向Example 添加一个静态方法,该方法无需创建加载和填充自身的对象即可更新?然后你可以这样做:

    foreach($example as $exampleId){
        Example::UpdateExampleStatus($exampleId,'active');
    }
    

    【讨论】:

    • 这是个好主意,我自己也想到了,这意味着要改变一些事情,因为我现在更新状态的方式就像 $Example::setToActive() 访问称为 $example::_updateStatus() 的受保护方法。因此,这将对我访问其他方法的方式产生影响,因为我无法访问静态方法中的类方法。将 $Example::setToActive() 更改为公共静态工作吗?然后将 $Example::updateStatus() 更改为受保护/私有静态.....
    • @user275074:我对你的实现还不够了解。显然你不能在这些方法中使用$this,你还应该将任何调用代码更改为self::method()而不是$this->method()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多