【发布时间】:2026-02-04 01:00:02
【问题描述】:
我正在学习 php 中的 pdo,以便使数据库访问更容易和更有效。我读过的 fetch _class 的一个解释是,对象的属性是在调用构造函数之前设置的。这是什么意思?非常感谢任何方向。
【问题讨论】:
-
在此处查看如何在空类上使用 PHP 中的通用 setter 和 getter:*.com/a/6605378/584490
我正在学习 php 中的 pdo,以便使数据库访问更容易和更有效。我读过的 fetch _class 的一个解释是,对象的属性是在调用构造函数之前设置的。这是什么意思?非常感谢任何方向。
【问题讨论】:
这意味着当使用 PDO 将结果返回到自定义对象时,需要设置与查询结果键对应的成员变量。
如:
class User
{
//Predefine Here
public $id;
public $username;
public $password;
public $email;
public $hash;
public function profileLink()
{
return sprintf('<a href="/profile/%s">%s</a>',$this->id,$this->username);
}
}
$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");
foreach($result as $user)
{
echo $user->profileLink();
}
这样 PDO 可以将变量设置到其内部范围之外的对象。
如果你的用户类是这样的:
class User
{
}
那么 PDO 将无法从范围之外设置值,因为没有定义属性。
【讨论】:
假设你有这段代码
<?php
class Foo {
public $bar;
public function __construct()
{
$this->bar = 1;
}
}
$stmt = $dbh->prepare("SELECT bar FROM foo");
$stmt->setFetchMode(PDO::FETCH_CLASS, 'Foo');
$stmt->execute();
$obj = $stmt->fetch()
?>
$obj 的 bar 属性将设置为“1”,而不是从数据库中检索到的值。
如果您希望将其设置为数据库的结果而不是“1”,您可以将获取模式更改为
$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Foo');
这会导致在将结果分配给属性之前调用构造函数
【讨论】:
而不是使用:FetchAll(PDO::FETCH_CLASS, 'classname')
您可以使用:fetchObject('classname')
例子:
class Car extends DatabaseTable {
const TABLE_NAME = 'cars';
// Table Columns
private $color;
private $brand;
private $type;
public function __construct($pdo, $id = false)
{
parent::__construct($pdo, TABLE_NAME, $id);
}
public static function getAll($pdo, $order = 'id') {
$query = 'SELECT * FROM ' . self::TABLE_NAME . '
ORDER BY ' . $order;
$statement = $pdo->prepare($query);
$objects = [];
while ($obj = $statement->fetchObject(self::class, [$pdo])) {
$objects[$obj->getId()] = $obj;
}
return $objects;
}
父构造函数只设置它的 3 个属性,例如:$this->id = $id;
【讨论】:
回顾 PDO::FETCH_CLASS,您实际上不需要将变量定义为 public 或 private(从 PHP 7.0 开始),您可以定义一个空类,PHP PDO 会将属性填充为 $Class->属性,即使它们没有定义。
这非常有用,因为您可以重用具有多个查询的类,这些查询处理同一个表但可能返回不同的列
【讨论】:
property_exists() 和类似的东西。