4

クラスの新しいインスタンスを作成するときにクラスをロードするために、クラスのコンストラクターにデータベースクエリを含めるのは悪い習慣ですか?

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"];
        }
    }
}

コンストラクターでオブジェクトを構築するクエリを使用することは、悪い習慣である可能性があると以前に言われました。

  • それが悪い習慣だとしたら、なぜそれが悪い習慣なのですか?
  • 代替手段は何ですか?
4

3 に答える 3

4

あなたのHomeクラスはドメインオブジェクトであり、理想的にはそれらがどのように永続化されているかを認識すべきではありません。

懸念事項を分離することで、柔軟性が得られます。これは、Data Mapper パターンとも呼ばれます。

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 を使用して、同じレコードを別々のオブジェクトに 2 回ロードすることを回避します。

ところで、これは部分的なデータ マッパーにすぎません。また、データベースからオブジェクトを更新、挿入、および削除するためにも使用されます。

于 2013-08-01T10:53:10.680 に答える
1

リポジトリ パターンは、この問題を軽減するのに役立つ便利なツールです。この以前の SO ディスカッションをご覧ください。

PHPでの適切なリポジトリパターン設計?

于 2013-08-01T10:35:25.137 に答える