如果您要在数据库中创建项目索引......也许是管理员的用户列表......在面向对象的世界中应该如何完成?
以此作为非常基本的例子:
$sql = 'SELECT
u.id,
u.name
FROM
users AS u
WHERE
u.deleted = "0000-00-00 00:00:00"';
echo '<ul>';
foreach ($db->fetch_all($sql) as $row) {
$url = './edit/?id=' . urlencode($row['id']);
echo '
<li><a href="' . html($url) . '">' . html($row['name']) . '</a></li>';
}
echo '<ul>';
请暂时忽略 HTML 与逻辑混在一起的事实(只是尽量保持简短)。
现在一些开发人员似乎认为在 OOP 世界中,应该这样做:
class user {
private $id;
public function __construct($id) {
$this->id = $id;
}
public function name_get() {
return $this->value_get('name');
}
public function admin_url_get() {
return '/admin/user/edit/?id=' . urlencode($this->id);
}
public function age_get() {
// Calculate from $this->value_get('dob'), using date_diff()
}
public function address_billing_get() {
// i.e. copy returned value onto the order object during checkout
}
public function address_delivery_get() {
}
private function value_get($field) {
$db = db_get();
$sql = 'SELECT
u.' . $db->escape_field($field) . '
FROM
user AS u
WHERE
u.id = "' . $db->escape($this->id) . '" AND
u.deleted = "0000-00-00 00:00:00"';
if ($row = $db->fetch($sql)) {
return $row[$field];
} else {
exit_with_error('Cannot return "' . $field . '" for user id "' . $this->id . '"');
}
}
}
class user_factory {
static function get_all() {
$users = array();
$db = db_get();
$sql = 'SELECT
u.id
FROM
user AS u
WHERE
u.deleted = "0000-00-00 00:00:00"';
foreach ($db->fetch_all($sql) as $row) {
$users[] = new user($row['id']);
}
return $users;
}
}
echo '<ul>';
foreach (user_factory::get_all() as $user) {
echo '
<li><a href="' . html($user->admin_url_get()) . '">' . html($user->name_get()) . '</a></li>';
}
echo '</ul>';
这方面的一些变化包括:
使用 ORM,因此您不必编写实际的 SQL(但那是另一天)。
更改用户__construct 方法以执行SELECT * FROM user WHERE id = X,因此无需每次都通过user->value_get() 查找单个值。
让 user_factory::get_all() 方法执行 SELECT * FROM,并将所有值传递到各个用户对象中……我相信这被称为“构建器”模式(而不是工厂)。
对我来说,这一切似乎都非常低效,有许多查询进出数据库......或者获取不需要的数据(SELECT * FROM 并不是一个好主意)。
例如,假设用户表有诸如他们的家庭/账单地址之类的字段(每个作为第 1、2、3 行、城镇、邮政编码等)......姓名。
我还假设工厂/构建器对象也应该能够接受参数进行搜索(例如,管理员正在寻找特定用户,也许在此页面上它还应该在搜索中包含他们的电子邮件地址字段),并且还通过在一个限制中(例如分页,我猜 10,000+ 条记录可能会导致请求超时)。