gpt4 book ai didi

php - PDO 没有选择通过带有 FETCH_CLASS 的构造函数创建对象的选项是有原因的吗?

转载 作者:行者123 更新时间:2023-11-30 22:10:23 27 4
gpt4 key购买 nike

在使用 PDO::FETCH_CLASS 时,似乎没有办法让 PDO 使用构造函数/setter 创建新对象。

我猜,目前使用 FETCH_CLASS 时,成员变量会使用反射来填充。它们当然不会通过构造函数传递。这很可惜,因为它绕过了您在构造函数中可能进行的任何检查以确保对象的一致性(任务不能在没有设置 $finishedDate 的情况下使 $status = finished)。

有多种选择,其中一些对于非常极端的情况是特殊的(比如 PDO::FETCH_NAMED)。这让我假设构造函数创建没有实现,因为有一些原因表明这不是一个好主意。

注意:我不是在寻找不传递行值的 fetchAll (ctor_args) 的第三个参数,而是寻找提供的值。

更新: 看来我没有清楚描述我要问的内容。想象一下我有这样的构造函数:

public function __construct($id, $number) {
if ($id == $number) {
throw new InvalidArgumentException("Number and ID can't be same");
}
}

SELECT id, number FROM table

使用任何设置,即使是 $st->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Foo'); 它也不会抛出异常并会愉快地创建对象不一致的状态。因为值不是通过构造函数设置的。实际上最接近我所谓的预期行为的是 https://stackoverflow.com/a/33027392/112000 中提到的行为。

更新:我为此 https://bugs.php.net/bug.php?id=73397 创建了一个功能请求以防万一您也对此感兴趣。

最佳答案

我认为这是出于历史原因。

起初有 mysql_fetch_object - 只是为了补充获取三元组 - 一个列表、一个散列、一个对象 - 以在数据库行之外创建一个类实例。

然后进入 PDO,它有很多不错的特性,但仍然在相同的范例下——在数据库中的列之后分配新创建的变量的属性。

所以我认为这很简单,因为没有人知道 PDO 可以这样使用。

所以我认为最接近的结果是using a closure to create an instance :

$job = $pdo
->query('SELECT id, number FROM users')
->fetchAll(PDO::FETCH_FUNC, function($id,$number) {return new Job($id,$number);});

关于php - PDO 没有选择通过带有 FETCH_CLASS 的构造函数创建对象的选项是有原因的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268625/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com