#php #doctrine-orm
#php #doctrine-orm
Вопрос:
У меня есть вопрос из любопытства о внутренней работе Doctrine2. Я, как пользователь, вижу действительно чистый и надежный интерфейс, но под капотом должна быть какая-то тяжелая магия.
Когда я создаю простую сущность, она выглядит примерно так:
class SimpleEntity
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMColumn(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;
}
}
Как вы заметите, одна вещь явно отсутствует, нет способа установить идентификатор, но, тем не менее, фабрики doctrines возвращают объекты с установленными идентификаторами. Как это может работать? Я попытался просмотреть исходный код, но где-то потерял трек.
Как можно перезаписать защищенные значения, не находясь в иерархии классов?
Комментарии:
1. Может быть, есть что-то в
@ORM
аннотациях. Я думаю, что именно здесь происходит волшебство.2. Аннотации дают doctrine точку входа через отражение, но способно ли отражение устанавливать значения? Это даже противоречило бы названию…
Ответ №1:
Ответ таков Отражение. Смотрите http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/getting-started-xml-edition.html#a-first-prototype
Не углубляясь в источник Doctrine, я бы сказал, что он использует ReflectionProperty::setValue()
Комментарии:
1. @Phil — Я бы так не сказал, вероятно, просто незнание.
2. @Phil Вы определяете класс с защищенными / частными свойствами, и язык фактически дает вам способы доступа и изменения их извне… Эти функции, как правило, используются слишком многими разработчиками.
3. @Floyd Threepwood Еще немного почитать здесь — en.wikipedia.org/wiki/Reflection_ (компьютерное программирование)