Все, что вы можете сделать, это выяснить, какие методы до сих пор назывались , установив какое-то глобальное состояние в классе. Но вы не можете узнать, какие методы вызываются после метода, и вы не сможете определить разницу между методами в одной цепочке и методами в другой:
$obj->m1()->m2();
$obj->m3(); // You would think that m1() and m2() came before this in the same chain
Вам понадобится метод в конце каждой цепочки, чтобы очистить глобальное состояние в классе.
Поскольку кажется, что вам нужно увидеть, какой метод идет следующим в цепочке, это не сработает для вас.
Я бы сказал, что это действительно плохой шаблон проектирования, по крайней мере для PHP (и любого другого языка, на котором я работал). Каждый метод должен делать только одну вещь. Если вам нужен метод для возврата строки или объекта в зависимости от того, что вам понадобится позже, вы делаете что-то не так.
Конечно, я делал что-то подобное раньше. Это был класс метаинформации для изображений, представленных пользователями - вы можете настроить его следующим образом:
$meta = new ImageMeta();
$meta->first_name("foo")->last_name("bar")->email("baz")->id("guid");
Но, если вы сделали это:
$meta->first_name();
это вернет строку. Значением по умолчанию для первого параметра было NULL, и если метод получил NULL, он вернул строку. В противном случае он установил (и избежал) внутреннее значение и вернул $this
.
Сначала я думал, что это круто, но это оказалось ошибкой. Я ненавижу использовать этот класс сейчас. Просто заставьте один метод / функцию делать одну только одну вещь, и вы будете намного счастливее.