2010-02-19 43 views
5

这是我经常遇到的一个设计问题,我希望找到关于该主题的一些常见见解。这里提供的代码仅仅是一个例子。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或名称从数据库中提取用户。
  • 用户实例可以序列化为会话数据。

不是一个面向对象的大师,我发现它非常简单但干净而实用。面向对象的文本有过分简单的任务的倾向,我的日常工作主要是在小型项目中。

+0

您将如何使用第二种方法创建新用户?数据库中不存在新用户。 – Rune 2010-02-19 13:05:07

+0

你提到的代码片段看起来像是我对ActiveRecord模式的一个实现。 – Gordon 2010-02-28 11:32:13

回答

7

这取决于你的架构。四种常见数据源的体系结构模式可在Martin FowlerPatterns of Enterprise Application Architecture找到:

  • Table Data Gateway

    充当网关到数据库表的对象。一个实例处理表中的所有行。

  • Row Data Gateway

    充当网关的单个记录在数据源中的对象。每行有一个实例。

  • Active Record

    在一个数据库中的表或视图包装了一个行的对象,封装了数据库访问,以及在该数据添加域逻辑。

  • Data Mapper

    映射器的一个层,其目的和同时保持它们彼此独立,并映射器本身的数据库之间移动数据。

而且图案:

2

你有没有考虑使用对象关系映射库像DoctrinePropel

+0

不是。我希望提高自己的设计技能,而不是学习第三方库。 – 2010-02-22 10:36:58

+0

我会怀疑在一个已经存在好的解决方案的领域提高你的设计技能是否是提高**最有效的地方。如果您使用体面的第三方库,您可以腾出时间在没有第三方解决方案的地区提高设计技能。 – 2010-02-22 11:13:29

+0

不过,我希望即使没有框架也能编写出好的代码。你知道的一般文化。 – 2010-02-25 11:19:16

相关问题