2009-09-26 1 views
1

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

Пример: класс Controller_Index звонит $this->composite('SomeCompositeClass') в пределах своего __construct() метода. Класс SomeCompositeClass имеет метод helloWorld(). Я хочу посмотреть, могу ли я позвонить Controller_Index->helloWorld().

В принципе, я хочу посмотреть, будет ли мой контроллер добавлять какие-либо составные классы (используя $this->composite()), чтобы я мог проверить, содержат ли эти составные классы метод, который я запрашиваю (helloWorld()). И я хотел бы сделать это, не создавая вначале Controller_Index.

Спасибо!

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

Edit 2
Интерфейсы не поможет, потому что я не обязательно позвонит $this->composite() от каждого контроллера.

Возможно, мне просто нужно переосмыслить проблему и пойти другим путем.

ответ

3

Прежде всего, вы не можете этого сделать в целом. Анализ общего кода, чтобы увидеть, достигнет ли он когда-либо определенного момента его выполнения, является неразрешимым, поэтому даже если вы синтаксически обнаруживаете вызовы на composite, вы не знаете, будут ли они выполняться без фактического выполнения кода.

Теперь, в практическом смысле, вы можете получить некоторый рычаг, загрузив код в виде текста и изучив его для звонков на номер composite, но это будет только любое использование, если вы напишете классы в последовательная мода. Он не будет отображать вызовы, скрывающиеся за цепочками вызовов функций, ложно обозначать условно охраняемые вызовы и т. Д. Вам почти наверняка лучше использовать другой метод, например PHP interfaces для статического анализа.

0

Если вы хотите, чтобы функция класса вызывалась без инициирования какого-либо объекта, вы ищете «static method».

В основном статические методы относятся к классу NOT объекта класса. Поэтому вы можете назвать его без инициализации сначала, как 'Class1::doStaticMethodAction()'.

+0

Я не хочу вызывать метод без первого экземпляра класса, я хочу, чтобы класс WILL вызывал метод. –

1

Я не думаю, что вы можете запрограммировать предсказание того, что вызовет конструктор класса, когда он выполняется, без фактического выполнения кода, если вы не хотите попасть в сферу интерпретации фактического языка без его выполнения. ИМО, этот подход является очень окольным способом обеспечения того, чтобы класс применял конкретный метод. Почему бы не использовать interfaces? Вы также можете реорганизовать метод composite() для использования type hinting, чтобы гарантировать, что только метод вашего типа (содержащий ваш метод hellowworld()) используется методом composite().