【发布时间】:2012-05-24 14:55:55
【问题描述】:
我是 PHP 的新手,我正在寻找实现一些数据库访问代码的最佳方法。我正在尝试创建一些简单的数据库访问对象——每个表都有自己的类,该类的每个实例代表表中的一行,你知道的。
我的代码似乎可以工作,但我在网上看到的一些内容让我担心我的方法可能会以某种方式出错。自从“我可以这样做吗?” “我应该这样做吗?”是两个不同的问题,我希望一些 PHP 专家能加入进来。
我目前的策略是创建一个包含所有通用代码的基本抽象 Table 类,然后让代表单个表的每个类对其进行扩展。
我主要关心的是这段代码:
abstract class Table {
protected abstract static function get_fields();
protected abstract static function get_primary_key();
protected abstract static function get_table_name();
想法是每个实现类都会定义字段名、主键、表名等,然后 Table 类将使用这些函数来填充特定的空白,如下所示:
static function insert($values) {
$field_list = array();
$value_list = array();
foreach (static::get_fields() as $field_name) {
if (isset($values[$field_name])) {
$field_list[] = $field_name;
$value_list[] = self::escape($values[$field_name]);
}
}
$field_string = join(", ", $field_list);
$value_string = "'" . join("', '", $value_list) . "'";
$sql = "insert into " . static::get_table_name() . " ($field_string) values ($value_string)";
如您所见,关键是我正在访问那些static abstract 函数,方法是在它们前面加上static::。据我所知,它正在工作!
但是,this question 接受的答案表明 abstract static 函数在 5.3 中仍然是不允许的。
所以,我想弄清楚该怎么做。答案是否错误——abstract static 函数现在被认为是完全合法的 PHP 代码吗?我在我的代码中做了一些不可取的事情吗?我应该考虑另一种方法吗?
【问题讨论】:
-
如果你说“你知道交易”,我肯定知道一件事:交易就是不为此使用静态函数。如果您认为是这样,那一定是空检查器处理,因为静态函数不适用于您喜欢使用的继承。另外我建议您阅读 PoEEA,我的意思是,您知道交易类型的书,对吗?
-
@hakre:这种敌意和屈尊从何而来? “你知道演习”是对我认为不值得深究的一种相当标准的数据库内容建模方法的参考。
-
请参考您所描述的是一种相当标准的方法。
-
有许多可用于 PHP 的 ORM 框架,包括(但不限于)Doctrine、Zend Framework 和 Propel。这是一个非常复杂的轮子;你确定要重新发明它吗?
-
@Phoenix:说真的?主啊,没有。但我的选择令人不快;我们没有适合生产服务器的系统管理员,并且那里的 PHP 安装......我会很好,称之为“功能轻”。安装任何有趣的东西对我来说都太白痴了。我宁愿自己造轮子,尽管它可能不完美,也不愿一直拖着雪橇。
标签: php design-patterns