微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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类是一个域对象,理想情况下,它们应该不知道它们是如何持久化的.

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

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);

您可以使用标识符映射来改进这一点,以避免将相同的记录两次加载到单独的对象中.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐