这是我经常遇到的一个设计问题,我希望找到关于该主题的一些常见见解。这里提供的代码仅仅是一个例子。OOP设计:如何将DB处理合并到应用程序对象中
在设计阶段很容易决定你需要一个对象:
User
==========
Unique ID
Login name
Password
Full name
而且很容易把它转换成一个数据库对象:
CREATE TABLE user (
user_id INT NOT NULL PRIMARY KEY,
username VARCHAR(15) NOT NULL UNIQUE,
password_hash CHAR(32) NOT NULL,
full_name VARCHAR(50)
);
我的疑惑开始在PHP的水平。最明显的转换:
<?php
class User{
public $user_id, $username, $full_name;
}
?>
不过,我应该怎么填写实际值?
我可以保持类DB无关:
<?php
class User{
public $user_id, $username, $full_name;
public function __construct($user_id, $username, $full_name){
$this->user_id = $user_id;
$this->username = $username;
$this->full_name = $full_name;
}
}
?>
但我需要运行查询别的地方...
我可以封装它的类构造函数中:
<?php
class User{
public $user_id, $username, $full_name;
public function __construct($user_id){
$sql = 'SELECT username, full_name FROM user WHERE user_id=?';
$parameters = array($user_id);
$res = get_row_from_db($sql, $parameters);
$this->user_id = $user_id;
$this->username = $res['username'];
$this->full_name = $res['username'];
}
}
?>
这看起来很优雅,但它阻止我做很多类的东西:
- 验证通过论坛帖子的用户名和密码($ user_id是还不知道)
- 打印用户信息用户(我买不起100个查询,以显示100个用户)
最有可能的,我需要定义几个类,但我不知道如何组织它。一个基类和许多子类?独立课程?具有特定方法的单个类?也许这是一个众所周知的设计模式,但我被教过程式编程。
我也很感激的一些想法:
- 处理用户
- 在会话中存储信息的集合,所以DB并不需要在每个页面请求要查询
====对于记录====
我已标记戈登的答复作为答案为它提供有趣的阅读。无论如何,这是值得指出的是,我已经在这可以总结如下PHP手册的对象序列化页面的用户评论一经发现一个very illustrative code snippet:
- 它使用一个类。
- 一个实例代表一个特定的用户。
- 构造函数提供了用户详细信息。
- 该类提供静态方法以获得必需的功能,然后才能创建实例。通过ID或名称从数据库中提取用户。
- 用户实例可以序列化为会话数据。
不是一个面向对象的大师,我发现它非常简单但干净而实用。面向对象的文本有过分简单的任务的倾向,我的日常工作主要是在小型项目中。
您将如何使用第二种方法创建新用户?数据库中不存在新用户。 – Rune 2010-02-19 13:05:07
你提到的代码片段看起来像是我对ActiveRecord模式的一个实现。 – Gordon 2010-02-28 11:32:13