То, что я пытаюсь сделать, – создать модель домена с обычным старым объектом PHP. Я создаю библиотеку, которая будет делать всю инфраструктуру. Итак, одна из моих моделей выглядит так
class Project { public $id; public $name; public $typeId; private $type; public function getType() { return $this->type; } public function setType(Type $type) { $this->typeId = $type->id; $this->type = $type; } }
Теперь, если вы создаете новый проект и вызываете setType
с допустимым типом объекта и сохраняете экземпляр проекта, используя ORM, как проект, так и тип сохраняются. Но затем я загружаю проект и использую метод getType
Я хочу, чтобы ORM модифицировал этот метод прозрачно, чтобы загрузить объект из постоянства. Итак, этот метод здесь:
public function getType() { return $this->type; }
для прозрачного изменения:
public function getType() { if (is_null($this->type) { $this->type = $this->adapter->findById('table', $this->typeId); } return $this->type; // or return parent::getType(); }
Outlet PHP использует eval для создания класса Proxy для Project под названием Project_Proxy, но иногда есть подклассы Project, поэтому я ищу решение, используя Reflection API, если есть способ.
У меня есть поиск google, но я все равно не смог изменить поведение метода
Изменить: или было бы неплохо использовать метод Eval для PHP для создания прокси-классов для моих моделей и всех подклассов?
Нет встроенного способа сделать это. И хотя вы можете это сделать, используя расширение PECL под названием runkit , я настоятельно рекомендую найти другое решение. Изменение реализации функций, о которых вы ничего не знаете, очень опасно и может привести к ошибкам, при которых отладка одной такой ошибки может занять больше времени, чем запись if (is_null(...
операторов для всех ваших функций).
BTW: не используйте is_null()
, так как вы можете снова и снова is_null()
нулевые значения из базы данных. Вы должны сохранить выбранные значения в отдельной переменной.
Глядя на документ отражения на php.net, мне кажется, что невозможно модифицировать полету метод.
Вы должны попытаться сделать это по-другому.