Intereting Posts
Наличие опции настраиваемых классов, но унифицированное имя класса PHP glob (): по крайней мере один из переданных флагов недействителен или не поддерживается на этой платформе в Я не могу отключить ссылку на ненулевую дату Как защитить свой форум от спама? Установка переменных в Constructor VS для определения класса Как добавить путь к логотипу моей компании в Codeigniter? Разделить строку на 2 части по длине с помощью PHP отправка вложения электронной почты с помощью TCPDF php jquery, как механизм выбора объединение результатов двух выбранных объектов Zend \ Db \ sql \ sql Есть ли способ префикс имени элемента Zend_Form? PHP / PDO MySQL отключает соединение, если пользовательская функция используется в длинном запросе Ошибка MySQL: Неизвестный столбец в разделе where Почему мне нужно запустить команду «компоновщик-автозагрузка», чтобы миграция работала в laravel Проверьте, задана ли переменная, а затем повторите ее, не повторяя?

Цепочки методов PHP – Отражение?

Можно ли задуматься о цепочке вызовов методов, чтобы определить, в какой точке вы находитесь в цепочке вызовов? По крайней мере, можно ли различить, является ли метод последним вызовом в цепочке?

$instance->method1()->method2()->method3()->method4() 

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

 $instances->property1->property2->property3->property4 

Если все методы, которые вы вызываете, возвращают один и тот же объект для создания свободного интерфейса (в отличие от цепочки разных объектов вместе), должно быть довольно тривиально записывать вызовы методов в самом объекте.

например:

 class Eg { protected $_callStack = array(); public function f1() { $this->_callStack[] = __METHOD__; // other work } public function f2() { $this->_callStack[] = __METHOD__; // other work } public function getCallStack() { return $this->_callStack; } } 

Затем цепочка вызовов, таких как

 $a = new Eg; $a->f1()->f2()->f1(); 

оставил бы стек вызовов как: array ('f1', 'f2', 'f1');

debug_backtrace () не будет правильным в отношении использования «плавных интерфейсов» (соответствующее имя для «цепочки»), потому что каждый метод возвращается до того, как будет вызван следующий.

Для прикованных методов вы можете использовать методы перегрузки PHP5 (в этом случае __call).

Я не вижу причин, по которым вы хотите отслеживать привязанные свойства, но если вы настаиваете на этом, вы можете использовать метод перегрузки __get на своих классах, чтобы добавить нужные функции.

Пожалуйста, дайте мне знать, если вы не можете понять, как использовать приведенные выше предложения.

 $instances->property1->property2->property3->property4->method(); 

ИЛИ

 $instances->property1->property2->property3->property4=some_value 

Что касается первого вопроса: не без добавления кода для отслеживания, где вы находитесь в цепочке.

Я не думаю, что есть способ, чтобы класс знал, когда был сделан последний вызов метода. Я думаю, вам нужно что-то -> execute (); вызов функции в конце цепи.

Кроме того, включение таких функций, на мой взгляд, вероятно, сделает код слишком волшебным и неожиданным для пользователей и / или имеет симптомы с ошибками.