6

有什么办法可以将 PDO 的结果作为构造函数的参数传递?假设,我有以下课程:

class Test
{
    private $value1;
    private $value2;
    function __construct($val1, $val2)
    {
        $this->value1 = $val1; $this->value2 = $val2;
    }
}

然后,通过 PDO 驱动程序,我从 DB 中选择一些数据,比如说:

SELECT price, quantity FROM stock

$results = $query->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Test");

现在,PDO 将这些值直接传递给类字段,并绕过构造函数。

也许我遗漏了一些东西,但我想将查询的结果传递给构造函数。构造函数不能依赖于查询,即使不使用 PDO,我也希望能够实例化这个类。

4

6 回答 6

7

我想出的唯一方法是使用 FETCH_FUNC 常量并提供一个函数来通过构造函数创建对象。

function rowMapper( $price, $quantity)
{
  return new Test( $price, $quantity);
}
$results = $query->fetchAll( PDO::FETCH_FUNC, "rowMapper");

现在您的对象将仅使用您的构造函数创建,而不是让 PDO 在私有数据中注入值并破坏封装。

于 2015-10-08T23:06:38.937 回答
3

也许我遗漏了一些东西,但我想将查询的结果传递给构造函数。

查询的结果可以直接分配给您的对象属性PDO::FETCH_CLASS

如果需要,我们还需要一个能够覆盖 PDO 值的构造函数,因此PDO::FETCH_PROPS_LATE请从fetch.

function __construct($val1=null, $val2=null) {

      // now the constructor is called after the fetch
      // if you pass values to it, they will be assigned

  if ($val1!==null) $this->price = $val1; 
  if ($val2!==null) $this->quantity = $val2;
}

我们有两种实例化对象的方法

PDO

$stmt = $db->prepare('SELECT price, quantity FROM stock');
$stmt->setFetchMode(PDO::FETCH_CLASS,'Test');
$result = $stmt->fetch();

新的

$result = new Test(25,100);

如果您想使用来自数据库的值,您可以在构造函数中执行此操作,仍然FETCH_PROPS_LATE省略。

function __construct($val1=null, $val2=null) {
  if ($val1!==null) $this->price = $val1;
  if ($val2!==null) $this->quantity = $val2;
  $this->formattedPrice = number_format($this->price,'2');
}
于 2014-06-12T20:26:10.467 回答
2

我在为我的实体构建 PDO 存储库时遇到了这种情况。我不使用这种方法,因为我不喜欢必须一对一地匹配参数。这是我可以通过使用静态工厂模式来模仿构造函数的最接近的方法。

class User
{
    private $id;
    public $name;
    public $isMinor;

    // make sure parameters are in the same order as the mysql result
    public static function buildFromPdo($id, $age, $name)
    {
        $user = new self;
        $user->id = $id;
        $user->name = $name;
        $user->isMinor = $age < 18;
        return $user;
    }

    public function getId()
    {
        return $this->id;
    }
}


$stmt = $db->prepare('SELECT id, age, name FROM users');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_FUNC, "User::buildFromPdo");

"$result" 将是一个用户对象数组。

于 2017-11-04T01:14:10.967 回答
1

[我编辑了这个答案,因为我之前的答案不再准确。]

FETCH_CLASS 确实获取到私有属性。请参考这个答案

于 2012-09-11T10:53:16.333 回答
-1

在您的情况下,您可以像这样传递它们:

$results = $query->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Test", array('val1', 'val1'));

阅读fetchAll() 此处的第三个参数。

于 2014-09-18T08:37:23.977 回答
-1

使用 PdoObject::fetchAll(\PDO::FETCH_CLASS),这将返回你想要的。

不过,如果您需要特定的东西来传递,请遵循以下代码片段

$sql = "SELECT * FROM ".$table. " WHERE id=$id";
$sth = $dbAdapter->prepare($sql);
$sth->execute();

//inject anything you want
$result = $sth->fetchAll(\PDO::FETCH_CLASS, $tableClass, array($pass1, $pass2, $dbAdapter));

于 2020-10-30T16:16:31.253 回答