超类字段不会被PDO (php)映射到子类中


SuperClass fields are not mapped in the subclass with PDO (php)

我有如下的PersistentObject类

abstract class PersistentObject implements IPersistable
{
    private $id;
    public function getId()
    {
        return $this->id;
    }
    public function setId($id)
    {
        $this->id = $id;
    }
}

和UserModel扩展PersistentObject

class UserModel extends PersistentObject
{
    public static $TABLE_NAME = "user";
    private $email;
    private $username;
    private $password;
    public function getEmail()
    {
        return $this->email;
    }
    public function setEmail($email)
    {
        $this->email = $email;
    }
    public function getUsername()
    {
        return $this->username;
    }
    public function setUsername($username)
    {
        $this->username = $username;
    }
    public function getPassword()
    {
        return $this->password;
    }
    public function setPassword($password)
    {
        $this->password = $password;
    }
}

现在当我用pdo

获取usermodel时
$entity = $stmt->fetchObject("UserModel");

我得到的结果(var_dump($entity)):

object(UserModel)[11]
  private 'email' => string 'andrewwww@gmail.com' (length=24)
  private 'username' => string 'andrewww' (length=13)
  private 'password' => string '72bed4064dbe53d7fc5fd078214387c813c1f670' (length=40)
  private 'id' (PersistentObject) => null
  public 'id' => string '2' (length=1)

如果我尝试

var_dump($entity->getId());

I receive null;

如何将超类字段映射到子类??非常感谢!

这正是privateprotected的区别。

从http://php.net/manual/en/language.oop5.visibility.php

:

声明为protected的成员只能在类本身以及被继承类和父类访问。声明为private的成员只能由定义该成员的类访问。

所以在父类中使用protected:

abstract class PersistentObject implements IPersistable
{
    protected $id;
    ...