Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对某个PHP类的每个实例化对象执行一个方法_Php_Oop_Postgresql - Fatal编程技术网

对某个PHP类的每个实例化对象执行一个方法

对某个PHP类的每个实例化对象执行一个方法,php,oop,postgresql,Php,Oop,Postgresql,所以我在PHP中遇到了这个问题,我有一个名为unit的类,它是一个名为units的表的引用,所以当我更新表units上的一行时,我必须更新我的对象单元,调用一个名为refresh()的方法,比如$unit->refresh()。这对我来说没问题,因为对一行的所有更新都是从对象单元进行的 当另一个类更新units表时,问题就会出现。例如,假设我有一个名为units的类(复数形式)。此类对units表进行大量更改,更改unit类的对象可能引用的行 所以我在想,也许unit类上的一个静态方法可以使类型

所以我在PHP中遇到了这个问题,我有一个名为unit的类,它是一个名为units的表的引用,所以当我更新表units上的一行时,我必须更新我的对象单元,调用一个名为refresh()的方法,比如$unit->refresh()。这对我来说没问题,因为对一行的所有更新都是从对象单元进行的

当另一个类更新units表时,问题就会出现。例如,假设我有一个名为units的类(复数形式)。此类对units表进行大量更改,更改unit类的对象可能引用的行

所以我在想,也许unit类上的一个静态方法可以使类型为unit的所有已创建对象都成为unit,可以让它们调用they refresh()方法,或者可能有另一种方法来实现这一点(比如ORM或设计模式)。我有两个必备条件,1)我将使用posgtres,我不会改变这一点,2)我使用了大量的用户函数和触发器以及复杂的SQL(大量的时间和日期计算、内部选择等等)


那么,在这种情况下有什么有用呢?

为什么不创建一个对象池,然后在需要时对池中的每个对象调用刷新方法呢?这是目前为止解决手头问题的最简单、最优雅的解决方案。

您的设备听起来像一台机器。理论上,您可以让您的
单元
集合执行以下操作:

public function refreshAll()
{
    foreach ($this->units as $unit) {
        if ($unit->isModified) {
            $unit->update()
        }
    }
}
我强烈不鼓励这样做,因为这样会导致每个
单元
实例有一个查询。往返数据库通常是一个瓶颈。想象一下,您必须更新几百个甚至数千个实例

更好的方法是只收集下一个事务中所需的所有查询,并在一个请求中发出它们,例如

public function refreshAll()
{
    $sql = '';
    foreach ($this->units as $unit) {
        if ($unit->isModified) {
            $sql .= $unit->getSql();
        }
    }
    // these are dummy method calls. 
    // i dont know if postgres supports transactions or multiqueries
    $this->dbAdapter->startTransaction();
    $this->dbAdapter->multiQuery($sql);
    $this->dbAdapter->commitOrRollback();
}
另一种选择是使用专用模式

谷歌图书节选:


注意,当使用一个工作单元时,您也可能会考虑完全从您的代码>单元< /COD>实例中删除数据库访问代码(删除ActVIECORD),因为您正在将责任保存到其他类中(那么好)。

< P>您已经回答了这个问题。我会选择ORM(因为使用PHP,你的最佳选择是。正如Gordon在评论中提到的“工作单元”,条令使用这种模式正是为了实现这一目的。要给出刷新的示例,请查看关于刷新对象/关系的


如果ORM对您来说太重,前面提到的就是您的答案,您可以为项目编写自己的、轻量级的UoW。这个例子解释了原则2.0 UoW以及如何处理它。

因为它可以创建一个查询,所以问题是我必须更新的silge行的数量,也许我可以得到一个afect列表编辑行并执行更新…其中id=($StringOfidSeparatedByComas)。此外,我还担心我需要对代码进行大量更改,直到我意识到我可以注册所有调用singleton objectpool的对象并注册该变量。这可能会起作用,但在此之前,让我们看一看doctrine将尝试使用与工作单位混合的身份图,这似乎是一条可行之路。感谢您的回答!@Jeeba,不客气。我们鼓励您通过单击旁边的复选标记大纲来接受您认为最有用的答案。抱歉,延迟=)。感谢您提供有关工作单位和条令的信息。看起来很有趣,与APC的集成是一个很好的选择,但是这个项目非常先进,我计划使用一个身份图的修改版本。与工作单元混合。我主要使用数组的包装器作为我的域对象,看看它是如何与我的想法结合在一起的。