PDO:fetchClass没有设置父类的属性

时间:2015-08-26 18:48:43

标签: php mysql pdo

所以我有三节课:

class GenericObject{
    private $parentThing
}

class MiddleObject extends GenericObject{
     private $middleThing
}

class ChildObject extends MiddleObject{
     private $childThing;    
}

当我致电pdoDatabaseThing->fetchAll(PDO::FETCH_CLASS, "ChildObject");时, MiddleObject中定义的所有属性都为null,尽管ChildObject和GenericObject中定义的属性是按预期设置的。

这是预期的行为,还是我错过了代码中某处的错误?有没有已知的解决方法?

1 个答案:

答案 0 :(得分:1)

看起来这是预期的行为。 ChildObject不了解父类的私有字段,因为它们在该类中是私有的,这就是重点。当父字段至少为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"

如果您将“父母”字段的可见性更改为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