gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:07:23 24 4
gpt4 key购买 nike

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

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

所以我在想,如果单元类上的静态方法可以使所有创建的单元类型的对象,可以让它们调用它们的 refresh() 方法,或者也许有另一种方法来处理这个(比如 ORM,或设计模式)。我有两个先决条件,1) 我将在 posgtres 上工作并且我不会更改它,2) 我使用大量用户函数和触发器以及复杂的 SQL(大量时间和日期计算、内部选择等)。

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

最佳答案

你的单位听起来像一个ActiveRecord .理论上,您可以让 Units 集合执行如下操作:

public function refreshAll()
{
foreach ($this->units as $unit) {
if ($unit->isModified) {
$unit->update()
}
}
}

我强烈不鼓励这样做,因为这会导致每个 Unit 实例有一个查询。往返数据库通常是一个瓶颈。试想一下,您必须更新数百甚至数千个实例。

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

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();
}

另一种选择是使用专用的 Unit of Work图案。

Google 图书摘录:

请注意,当使用工作单元时,您可能还需要考虑从您的 Unit 实例中完全删除数据库访问代码(删除 ActiveRecord),因为您正在转移保存的责任然后将您的对象放入其他类(这很好)。

关于php - 对某个 PHP 类的每个实例化对象执行一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4469006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com