【发布时间】:2011-10-18 13:50:25
【问题描述】:
我正在尝试改进在我构建的轻型框架中用于数据库事务的方法。
理解问题的信息:
这是我编写的一个类(connect.php 加载数据库凭据;PHP PDO 的包装器,存储在$db;和Base.php):
<?php
require_once('connect.php');
class Advertiser extends Base
{
public static function getByID($id)
{
global $db;
$sql = "SELECT * FROM advertiser WHERE advertiserid=?";
$values = array($id);
$res = $db->qwv($sql, $values);
return Advertiser::wrap($res);
}
public static function add($name)
{
$adv = new Advertiser(null, $name);
$res = $adv->save();
return $res;
}
public static function wrap($advs)
{
$advList = array();
foreach( $advs as $adv )
{
array_push($advList, new Advertiser($adv['advertiserid'], $adv['name']));
}
return Advertiser::sendback($advList);
}
private $advertiserid;
private $name;
public function __construct($advertiserid, $name)
{
$this->advertiserid = $advertiserid;
$this->name = $name;
}
public function __get($var)
{
return $this->$var;
}
public function save()
{
global $db;
if( !isset($this->advertiserid) )
{
$sql = "INSERT INTO advertisers (name) VALUES(?)";
$values = array($this->name);
$db->qwv($sql, $values);
if( $db->stat() )
{
$this->advertiserid = $db->last();
return $this;
}
else
{
return false;
}
}
else
{
$sql = "UPDATE advertisers SET name=? WHERE advertiserid=?";
$values = array ($this->name, $this->advertiserid);
$db->qwv($sql, $values);
return $db->stat();
}
}
}
?>
如您所见,它具有相当标准的CRUD 函数(编辑:好的,在这个实现中只有 CRU)。有时,我会通过添加更多函数来扩展这样的类,这正是这些类的用途。例如,我可能会在这个类中添加以下函数(假设我在数据库中添加了一个列isBanned):
public static function getBanned()
{
global $db;
$sql = "SELECT * FROM advertiser WHERE isBanned=1";
$res = $db->q($sql);
return Advertiser::wrap($res);
}
问题:
我如何创建一个包罗万象的类,该类在存在和必要时还能加载自定义模型类?
例如,如果我写如下代码:
$model = new Catchall();
$banned = $model->Advertiser::getByID(4);
我希望我的包罗万象的类修改它的查询,以便所有对表/列的引用都是我选择的任何名称(Advertiser,在这种情况下),但要小写。
另外,如果我想创建一个像上面写的那样的自定义函数,我希望我的包罗万象的类能够确定一个文件存在于它的路径中(当然是以前定义的),其名称是我已经定义的指定(Advertisers.php,在这种情况下)并加载它。
Advertisers.php 将是 extends Catchall 并且只包含我的自定义函数。
通过这种方式,我可以拥有一个适用于所有 CRUD 函数的 Catchall 类,并且能够根据需要轻松扩展任意类。
- 我需要了解哪些想法/概念才能做到这一点?
- 我在哪里可以找到这样的示例,无需深入研究大量 CodeIgniter 或 Zend 源代码?
- 我要做什么叫?
【问题讨论】:
-
请,停止使用全局变量!
-
@teresko,请解释一种更好的方法来获得对在定义的类之外实例化的数据库对象的访问权限。我愿意接受建议,如果对您有帮助,我会很乐意向您展示我的代码的完整结构。我已经为此工作了很长时间,并且使用单个全局变量是合适的解决方案。请使用有效来源支持您的需求。我使用了一个全局变量,因为我需要数据库连接一次,并且在每个函数中创建一个新连接至少是 FOOLISH。
-
我使用静态类来封装数据库访问方法 - 比具有相似范围的全局更好
-
@rockerest ,您应该将相同的数据库连接对象实例传递给每个模型:pastie.org/2310815
-
@rockest:因为它无助于代码的可测试性和可读性。使用您的 API 的人不会通过查看方法头看到他需要建立数据库连接。相反,他们必须遇到异常或遍历您的代码。看看来自 Google Tech Talk 的“清洁代码”系列。 youtube.com/watch?v=-FRm3VPhseI
标签: php database oop database-design