PHP OOP 类设计

标签 php mysql oop class object

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

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

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

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

提前致谢

最佳答案

执行版本 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){
  }
}

关于PHP OOP 类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794556/

相关文章:

javascript - 在 Cpanel 上使用 Javascript AJAX POST 时出现 500 内部服务器错误

php 统计 z 分数正态分布

c# - 修改父行为的访问者的层次结构。 Liskov 还好吗?

arrays - 在 Smalltalk 中读取数组中的字符串并将其转换为数组

php - 解释正确的mysqli对象的逻辑

php - 如何使 PHPUnit 在有风险的测试中失败

Windows 中的 PHP 5.5.21/Apache 2.4/MySQL 5.6.22 出现 PHP PDO "could not find driver"错误

php - 我可以从 MySQL 读取 SQL Server 中的表吗?

php - 在选择查询中从两个不同的表中减去两个不同的列总和

oop - OO : Should you access your private variables through properties inside your class?