使用PDO::FETCH_CLASSTYPE传递构造函数参数


pass constructor arguments using PDO::FETCH_CLASSTYPE

我正在用一个新的基于PDO的版本替换旧的数据库层。

但是我遇到了一个问题:

当使用fetchObject获取对象时,i可以传递对象构造函数的参数。

然而,我现在移植了一个类,它有几个子类,都存储在同一个表中,我想使用FETCH_CLASSTYPE。这意味着我必须使用常规的fetch()方法,我不能向其传递构造函数参数。

还有别的方法吗?

我可以将构造函数重命名为其他东西并手动调用它,但我想要一个干净的解决方案

似乎没有一个内置的解决方案。API的那部分看起来不太好。您可以使用一个变通方法:

$stmt->setFetchMode(PDO::FETCH_ASSOC);
while ($row = $stmt->fetch()) {
    /* "Factory" */
    $obj = new $row['class_name_column']('constructor', 'args');
    unset($row['class_name_column']);
    foreach ($row as $key => $value) {
        $obj->$key = $value;
    }
    var_dump($obj);
}

我认为在获取后立即在返回的实例上调用初始化方法是非常干净的

这是一个PHP bug,报告为#62567

您可以通过将任何带有构造函数

的类名作为第二个参数来解决这个问题。