【问题标题】:How do I use PDO's FETCH_CLASS to assign constructor arguments?如何使用 PDO 的 FETCH_CLASS 分配构造函数参数?
【发布时间】:2013-03-21 09:48:39
【问题描述】:

我想使用 PDO 创建对象的实例。我知道已经有很多questions,但我只发现可以将一组参数发送给构造函数。对我来说,构造函数似乎只能接受一个数组作为参数。然而,这会使构造函数变得不那么有意义。

我想用我自己的 getter 和 setter 创建一个类,如下所示:

class MyClass {
    private propertyA
    private propertyB

    public __constructor($argA, $argB) {
        $this->setPropertyA($argA);
        $this->setPropertyB($argB);
    }

    public setPropertyA($arg) {
        $this->proprtyA = $arg;
    }
}

有没有一种优雅的方法可以使用数据库中的数据创建此类的实例,最好是使用 PDO。

【问题讨论】:

  • 直接从 SQL 查询中实例化类的想法是违背任何优雅的。
  • 我还考虑创建存储库类并将数据从 FETCH_ASSOC 传递到我的模型类的构造函数。也许这样更好?
  • 为什么要使用数据库中的数据来创建对象?为什么???
  • 为什么不呢?假设我想编辑代表类实例的行。我将创建该类的一个实例,并将从数据库返回的数据传递到其类构造函数中。这样,我可以使用类的 getter 和 setter 编辑该类的属性,然后将其保存回数据库。我们在课堂上做了类似的事情,但使用 .NET 和 EF,他们称之为“存储库/服务模式”。我认为我可以跳过 PHP 中的整个 ORM 并使用 SQL 而不是 LINQ,因为它在语法上没有那么不同。
  • 这些cmets很奇怪,那你是只操作哑图(数组或stdClass对象)还是结果集?

标签: php pdo


【解决方案1】:

这里是免费的:

$handle = new PDO("blahblahblah");
$statement = $handle->prepare("SELECT blahblah");
$statement->execute();
$object_params = $statement->fetch(PDO::FETCH_ASSOC);

$object = new Object($object_params);
// OR...
$object = new Object($object_params["col_1"], $object_params["col_2"], "etc.");

或者:

class MyClass {
    private propertyA
    private propertyB

    public __constructor() {
        $handle = new PDO("blahblahblah");
        $statement = $handle->prepare("SELECT blahblah");
        $statement->execute();
        $object_params = $statement->fetch(PDO::FETCH_ASSOC);

        $this->setPropertyA($object_params[$argA_key]);
        $this->setPropertyB($object_params[$argB_key]);
    }

    public setPropertyA($arg) {
        $this->proprtyA = $arg;
    }
}

我不知道你在寻找什么。你能评论一下吗?

【讨论】:

  • 你的第一个例子看起来不错!我一直在寻找 FETCH_CLASS 的替代品,因为我不喜欢它处理属性的方式。
  • @GabrielSmoljár 只是出于好奇,您不喜欢它处理属性的方式吗? FETCH_CLASS 只是将列名与属性名匹配,并为每一行创建一个对象数组。我看不出这有什么不好?
  • 事实上它绕过了我的自定义 getter 和 setter。
  • 是的,那么如何防止它绕过 getter 和 setter 呢?我正在使用 DAO 模式,我需要有一个与 dao 类分开的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
  • 1970-01-01
  • 2017-06-14
  • 2023-01-16
  • 2012-08-05
  • 2018-03-27
  • 2013-02-26
相关资源
最近更新 更多