2011-07-22 225 views
2

从Java我正在添加使用类和对象,而不是简单的功能,手感更舒适。问题是: 我目前有一个'用户'类,它为我提供了获取访问级别,更改配置文件,删除通知等方法。每种方法都使用查询到我的数据库来提取所需的信息或更新它。但在构造函数中,我获得了基本信息:id,email,name和lastname(这是我在每种方法中使用最多的字段)。PHP OOP类设计

哪些设计可以使用: (当前)

class User{ 
    private $id; 
    private $email; 
    ... 

    function __construct($id){ 
     //Connect to database 
     ... 
     $this->id=$id; 
     $thid->name=$row['name']; 
     ... 

    } 

    function getEmail(){ 
     return $this->email; 
    } 
    ... 
} 

或者:

class User{ 
    private $id; 

    function __construct($id){ 
     $this->id=$id; 
    } 

    function getEmail(){ 
     //Connect to database using id 
     return $row['email']; 
    } 
    ... 
} 

我觉得是只是一对夫妇的文本字段的性能不会受到第二个得到改善,但我是一个begginer,所以我不知道。

在此先感谢

+0

中景:使用懒惰(第二)版本,但缓存的结果! –

回答

3

DO版本A 1和你的数据库查询的结果缓存到你的对象字段。您不希望每次在对象的生命周期中都访问数据库,并且在Web应用程序中,对象的生命周期只是单个页面请求,因此非原子数据操作污染的可能性很小。

此外,不要连接到你的构造数据库。花时间建立一个班级工厂来生成你的班级。老实说,你甚至可以编写一个非常简单的代码生成器来生成存储所有数据字段的模型类和转到db的映射器类,并在100行代码中从表中构建对象。

如果你有多余的时间,学习和使用的框架Zend的一样或者仅仅是数据,学说...

(FWIW,我认为学习简单的Zend表的东西将你净节省时间)

class User{ 
protected $_id; 
protected $_email; 
protected $_username; 
protected $_userFirstName; 

public function __construct(){ 
} 
public function setId($id){ 
    $this->_id = $id; 
    return $this; 
} 
public function setEmail($email) 
{ 
    $this->_email = $email; 
} 
    // etc and getters too 
} 

public class UserMapper 
{ 
    protected $_connection; 
    public function __construct($connection){ 
    $this->_connection = $connection; 
    } 
    public loadUser($id){ 
    $select = $this->_connection->select(' * from Users') 
         ->where('id = ?', $id); 
    $result = $select->fetchAll(); 
    //error checking here 
    $user = new User(); 
    $user->setId($results[0]['id']) 
     ->setEmail($results[0]['email']) 
     ->setUsername($results[0]['username']); 
    return $user; 
    } 
    public saveUser(User $user){ 
    } 
} 
+0

好吧,这是我迄今为止。但是我有其他的函数可以从其他数据库获取信息,那些没有存储在构造中的可以吗? (我知道我不会每次都使用它们)。 关于连接。我现在有一个函数'connect',它返回一个db连接,我用它来查询。你有什么资源或链接可以在php中看到类工厂的例子吗? 我会尝试Zend – Riskz

+0

是否可以将较小的调用包装为需要时实例化的较小对象?然后这些较小的对象可以由他们自己的工厂创建并且也可以被延迟加载。 (所以是的,但使用相同的想法在更小的模型中包装其他数据) – Zak

+0

好了,现在我明白了。感谢这个例子。但是,在映射器中连接数据库而不是构造器的主要优点是什么? 我看到的唯一区别是我可以使用相同的映射器来加载很多用户。对? – Riskz

1

我要说得到结构中的所有行,这样你就不必想从数据库中获取的东西,每次做一个新的查询。

所以在最后:去与选项#1。

0

我会先用,让你认为你会在大多数页面上使用所有必要的细节。

第二个版本的做法,因为查询你需要的是不好的做法

0

除非你将被立即用大量的这些对象的工作,在内存使用情况的差别是很小的数据库每次。然而,执行一个查询与多个查询的区别将更加明显,因此您应该只使用一个查询来一次检索所有数据。