六年前,我开始了一个新的PHP OOP项目,没有任何经验,所以我只是在我去的时候做了。无论如何,我注意到我相当强大的mySQL服务器有时会太容易陷入困境,并且想知道限制某些 db 活动的最佳方法是什么,当我提出这个时,作为一个例子......
private $q_enghours;
public function gEngHours() {
if ( isset($this->q_enghours) ) {
} else {
$q = "SELECT q_eh FROM " . quQUOTES . " WHERE id = " . $this->id;
if ($r = $this->_dblink->query($q)) {
$row = $r->fetch_row();
$r->free();
$this->q_enghours = $row[0];
}
else {
$this->q_enghours = 0;
}
}
return $this->q_enghours;
}
这似乎有效地大大减少了对 db 的必要读取。如果填充了对象属性,则无需访问 db 。请注意,对于“getter”,有大约24个类都具有相同的 db 访问例程。我只是在一个地方实现了这个改变,并且想知道是否有一个“最佳实践”,在我重新编写所有类之前我可能已经错过了。
答案 0 :(得分:2)
我会说这个问题是基于错误的前提。
如果你想处理“容易陷入困境”的数据库,那么你必须挖掘特殊原因,而不是仅仅猜测。你如此关注这些小事,实际上不会有任何区别。您必须个人资料整个应用程序并找到真正原因。
如果要减少读取次数,请在创建对象时,通过读取该记录并填充所有属性一次,使对象映射某些数据库记录。构造者是为它而制造的。
作为旁注,你真的需要一个好的数据库包装器,只是为了减少你为每个数据库调用编写的代码量,所以,这段代码可以写成
public function gEngHours() {
if ( !isset($this->q_enghours) ) {
$this->q_enghours = $this->db->getOne("SELECT q_eh FROM ?n WHERE id = ?", quQUOTES, $this->id);
}
return $this->q_enghours;
}
其中getOne()方法正在执行运行查询,获取行,从中获取第一个结果以及许多其他人认为正确的错误处理和使查询安全的所有工作。