Есть ли способ получить порядок вызова метода ООП? - PullRequest
3 голосов
/ 21 февраля 2010

Например, допустим, у меня есть набор классов и методов для этого:

$obj->method1()->method2();

Есть ли способ для метода1 () узнать сам по себе, что это первый вызываемый метод, или для метода2 узнать, что он последний?

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

Например

$obj->method1()->method2(); #Here method 2 will return lets say a string.
$obj->method1()->method2()->method3(); #Since method2 isnt at the end of the chain, it should return an instance of itself (or another object) here so that the chain could continue.

РЕДАКТИРОВАТЬ: любой, кто пытается сделать это - это плохой шаблон проектирования.

Это похоже на дубликат. См. этот вопрос для получения дополнительных ответов.

Ответы [ 4 ]

1 голос
/ 21 февраля 2010

Не из коробки, даже с трассировкой стека.

Полагаю, вы могли бы что-то соединить, используя константы или глобальные переменные:

Не пытайтесь делать это дома!

$GLOBALS["chain"] = array();
$obj->method1()->method2();    // method1 adds member to $GLOBALS["chain"], 
                               // array_push($GLOBALS["chain"], __FUNCTION__);
                               // method2 does the same...
print_r($GLOBALS["chain"]);

Это дало бы вам полную цепочку - пока нет, какая из них является последней, для этого вам придется передать флаг method2().

Но это было бы ужасно взломать и испортить ваш код.

Есть ли какая-то конкретная причина, по которой вам это нужно?

0 голосов
/ 21 февраля 2010

Все, что вы можете сделать, это выяснить, какие методы до сих пор назывались , установив какое-то глобальное состояние в классе. Но вы не можете узнать, какие методы вызываются после метода, и вы не сможете определить разницу между методами в одной цепочке и методами в другой:

$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.

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

0 голосов
/ 21 февраля 2010

Единственный способ, которым это возможно, - позволить методам сохранить некоторое глобальное состояние.

Если оба метода принадлежат одному и тому же классу, вы можете добавить в класс переменную и позволить каждому классу установить уникальное значение.

Но вопрос в том, желательно ли это. Такое поведение часто не очень умно в долгосрочной перспективе.

0 голосов
/ 21 февраля 2010

Я не думаю, что это возможно, нет - по крайней мере, я никогда ничего такого не видел.

(Из любопытства: зачем вам это? Может быть, можно было бы использовать другое решение для решения вашей настоящей проблемы?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...