【问题标题】:PHP OOP Class designPHP OOP 类设计
【发布时间】:2011-10-11 07:04:03
【问题描述】:

从 Java 开始,我觉得使用对象和类比使用普通函数更舒服。问题是: 我目前有一个“用户”类,它为我提供了获取访问级别、更改配置文件、删除通知等方法。每种方法都使用对我的数据库的查询来提取所需的信息或更新它。但在构造函数中,我得到了基本信息:id、email、name 和 lastname(这是我在每种方法中使用最多的字段)。

您会使用哪种设计: (当前)

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'];
   }
   ...
}

我觉得只是几个文本字段,第二个不会提高性能,但我是初学者所以我不知道。

提前致谢

【问题讨论】:

  • 中间立场:使用惰性(第二个)版本但缓存结果!

标签: php mysql oop class object


【解决方案1】:

执行版本 1 并将数据库查询的结果缓存到对象的字段中。您不想在对象的生命周期内每次都去数据库,而在 Web 应用程序中,对象的生命周期只是单页请求,因此非原子数据操作污染的可能性很小。

此外,不要在构造函数中连接到数据库。花时间建立一个类工厂来生成你的类。老实说,您甚至可以编写一个非常简单的代码生成器来生成存储所有数据字段的模型类和进入数据库并从表中构建对象的映射器类,代码不到 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){
  }
}

【讨论】:

  • 好的,这就是我目前所拥有的。但是我还有其他功能可以从其他数据库中获取信息,那些不存储在构建中可以吗? (我知道我不会每次都使用它们)。关于连接。我现在拥有的是一个函数'connect',它返回一个数据库连接,我用它来查询。您有任何来源或链接,我可以在其中看到 php 中的类工厂示例吗?我会试试 Zend
  • 是否可以将较小的调用包装为较小的对象,以便在需要时实例化?然后这些较小的对象可以由他们自己的工厂创建并且也可以延迟加载。 (所以是的,但使用相同的想法将其他数据包装在较小的模型中)
  • 好的,我明白了。谢谢你的例子。但是在映射器而不是构造器中连接到数据库的主要优点是什么?我看到的唯一区别是我可以使用同一个映射器来加载很多用户。对吗?
  • 有几件事..假设你想做一堆映射器..它们可能有共同的功能..你可以将它重构为一个基类。有人(Zend)可能已经为你创建了那个基类......当你分离职责时,它使你的代码更容易维护......
【解决方案2】:

我会说在构造上获取所有行,这样您就不必每次想从数据库中获取内容时都进行新查询。

总之:选择选项#1。

【讨论】:

    【解决方案3】:

    我会首先使用,获取您认为会在大多数页面上使用的所有必要详细信息。

    第二个版本是练习,因为每次需要查询数据库都是不好的练习

    【讨论】:

      【解决方案4】:

      除非您要同时处理大量此类对象,否则内存使用量的差异非常小。但是执行一个查询与执行几个查询的区别会更加明显,因此您绝对应该只使用一个查询一次检索所有数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 2012-03-27
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        相关资源
        最近更新 更多