Можно ли задуматься о цепочке вызовов методов, чтобы определить, в какой точке вы находитесь в цепочке вызовов? По крайней мере, можно ли различить, является ли метод последним вызовом в цепочке?
$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 (); вызов функции в конце цепи.
Кроме того, включение таких функций, на мой взгляд, вероятно, сделает код слишком волшебным и неожиданным для пользователей и / или имеет симптомы с ошибками.