У меня есть вопрос из любопытства о внутренней работе Доктрины2. Я, как пользователь, вижу действительно чистый и надежный интерфейс, но над капотом должна быть какая-то тяжелая магия.
Когда я создаю простой объект, он выглядит примерно так:
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; } }
Как вы заметите, одна вещь явно отсутствует, нет способа установить идентификатор, но тем не менее доктрины заводов возвращают объекты с установленными идентификаторами. Как это может работать? Я попытался просмотреть источник, но где-то потерял трек.
Как можно перезаписать защищенные значения, не входя в иерархию классов?
Ответ: Отражение . См. http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/getting-started-xml-edition.html#a-first-prototype.
Не копаясь в источнике Doctrine, я бы сказал, что он использует ReflectionProperty::setValue()