包含数据库查询的 PHP 构造函数来构建对象,好/坏?

标签 php mysql class constructor

在类的构造函数中进行数据库查询以便在创建类的新实例时加载它是否是一种不好的做法?

class Home
{
    private $home_id = null;
    private $home_name = null;
    private $home_number = null;
    private $home_street = null;

    function __construct($home_id)
    {
        $do_query = $mysql_con->query("SELECT * FROM home WHERE home_id = '$home_id'");

        while ($home_data = $do_query->fetch_assoc())
        {
            // Set all of the items in the object
            $this->home_id = $home_data["home_id"];
            $this->home_name = $home_data["home_name"];
            $this->home_number = $home_data["home_number"];
            $this->home_street = $home_data["home_street"];
        }
    }
}

我之前被告知,在构造函数中使用查询构建对象可能是一种不好的做法。

  • 如果这是不好的做法,为什么它是不好的做法?
  • 还有什么选择?

最佳答案

您的 Home 类是一个域对象,理想情况下,它们不应该知道它们是如何持久化的。

分离关注点可以实现灵 active 。这也称为数据映射器模式。

class Home
{
    public $home_id;
    public $home_name;
    public $home_number;
    public $home_street;
}

interface HomeMapperInterface
{
    public function get($id);
}

class HomeMapper implements HomeMapperInterface
{
    public function __construct($db)
    {
        $this->db = $db;
    }

    public function get($id)
    {
        $query = $this->db->query(...);
        if (($row = $do_query->fetch_assoc()) === false) {
            throw new RecordNotFoundException();
        }

        $home = new Home;
        $home->home_id = $row['home_id'];
        // ...

        return $home;
    }
}

使用方法:

$mapper = new HomeMapper($db);
$home = $mapper->get(123);

您可以通过使用 Identifier Map 来改进这一点,以避免将相同的记录两次加载到不同的对象中。

顺便说一句,这只是一个部分数据映射器;它还将用于更新、插入和删除数据库中的对象。

关于包含数据库查询的 PHP 构造函数来构建对象,好/坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991534/

相关文章:

php - 在 CentOS 问题上安装 PHP

php - 有没有像 PHP 一样的 JavaScript 函数来序列化和反序列化数组?

php - PHP解析/语法错误;以及如何解决它们

mysql - 缓慢的 MySQL InnoDB 插入和更新

C#-调用覆盖版本的方法的基本版本

PHP 日期格式、删除时间等

java - 无法删除、更改、更改...列名称 'number of shares' 带空格

php - 远程连接到 MySQL 数据库

javascript - 在类javascript类构造函数中使用异步调用

Java-类<?延伸 Collection >