所以我有三个类(class):
class GenericObject{
private $parentThing
}
class MiddleObject extends GenericObject{
private $middleThing
}
class ChildObject extends MiddleObject{
private $childThing;
}
当我调用 pdoDatabaseThing->fetchAll(PDO::FETCH_CLASS, "ChildObject");
,
尽管 ChildObject 和 GenericObject 中定义的属性按预期设置,但 MiddleObject 中定义的所有属性均为 null。
这是预期的行为,还是我只是在代码中遗漏了某个错误?有已知的解决方法吗?
最佳答案
看起来这是一个预期的行为。 ChildObject
不知道父类的私有(private)字段,因为它们在该类中是私有(private)的,这就是重点。当父字段至少为 protected
时您可以设置该字段,因为 ChildObject
类可以按预期使用它们。
<?php
class ParentClass {
protected $bar;
public function getBar() {
return $this->bar;
}
}
class ChildClass extends ParentClass {
private $foo;
public function getFoo() {
return $this->foo;
}
}
$dbh = new PDO('mysql:host=localhost', 'test');
$stmt = $dbh->query('SELECT "someValue" AS foo, "another value" as bar');
$all = $stmt->fetchAll(PDO::FETCH_CLASS, 'ChildClass');
$obj = $all[0];
var_dump($obj);
var_dump($obj->getFoo(), $obj->getBar());
这将生成以下输出:
object(ChildClass)#3 (2) {
["foo":"ChildClass":private]=>
string(9) "someValue"
["bar":protected]=>
string(13) "another value"
}
string(9) "someValue"
string(13) "another value"
如果将parents字段的可见性更改为private
你会得到你已经观察到的情况, parent 的私有(private)领域仍然在 NULL
:
object(ChildClass)#3 (3) {
["foo":"ChildClass":private]=>
string(9) "someValue"
["bar":"ParentClass":private]=>
NULL
["bar"]=>
string(13) "another value"
}
string(9) "someValue"
NULL
关于php - PDO:fetchClass未设置父类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32234441/