出于好奇,我有一个关于Doctrine2内部工作原理的问题。作为一个用户,我看到了一个非常干净和健壮的界面,但一定有一些沉重的魔法在幕后工作。
当我生成一个简单的实体时,它看起来像这样:
class SimpleEntity
{
/**
* @ORM'Id
* @ORM'Column(type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM'Column(type="string")
*/
protected $title;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set title
*
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* Get title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
}
你会注意到有一件事明显没有,没有办法设置id,但是理论工厂返回具有设置id的实体。这怎么可能呢?
如何能够覆盖受保护的值而不在类层次结构中?
答案是反射。看到http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/getting-started-xml-edition.html第一个原型
在不深入研究Doctrine源代码的情况下,我想说它使用了ReflectionProperty::setValue()