Intereting Posts
выполнить кронушку ровно один раз Копирование продуктов WooCommerce Цены на продажу до обычных цен и сброса Цены продажи 304: Не модифицировано и кэширование переднего конца Не удалось угадать, как получить экземпляр Doctrine из информации запроса Как включить помощника javascript в ErrorHanlder? Как проверить, пусто ли какие-либо поля в форме Как открыть несколько соединений сокетов и выполнить обратные вызовы в PHP Настройка корса в ларавеле 5.3 что является хорошим методом для дезинфекции всего массива $ _POST в php? imagettftext (): рассчитать размер шрифта, чтобы текст соответствовал ширине изображения Игнорировать / пропустить выходные с strtotime Пять уникальных случайных чисел из подмножества Войдите в Facebook с PHP-скриптом, но позвольте мне войти в браузер после окончания этого скрипта Получить папку загрузки и имя файла из браузера Должен ли я использовать функцию JOIN или запускать несколько запросов в структуре цикла?

Можно ли изменить методы экземпляра объекта с помощью отражения

То, что я пытаюсь сделать, – создать модель домена с обычным старым объектом 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, мне кажется, что невозможно модифицировать полету метод.

Вы должны попытаться сделать это по-другому.