Как я могу получить вызов в PHP?

Возможный дубликат:
Функция Caller в PHP 5?

Я хотел бы знать, откуда вызывается глобальная функция или публичный метод. Думаю, я мог бы это сделать, проверив debug_backtrace, но я предпочел бы использовать механизм более легкого веса, если он существует. Какие-либо предложения?

Например, что-то вроде этого, если вы представляете функцию get_callee () и постоянную существующую:

function doSomething() { if(get_callee() == 'PHP_GLOBAL') { throw new IllegalAccessException(); } ... } 

Изменить: Извините, теперь увидела вашу заметку о debug_backtrace ().

Нездоровый, но эй, если тебе нужно сделать это, то что-то не так.

Магия находится в функции get_callee () и debug_backtrace (). И да, добавьте некоторые проверки ошибок, если вы должны использовать это.

 <?php init(); function foo() { echo 'bar called from ' . get_callee() . '<br />'; bar(); } function bar() { echo 'foo called from ' . get_callee() . '<br />'; } function init() { echo 'init.. <br />'; foo(); } function get_callee() { $backtrace = debug_backtrace(); return $backtrace[1]['function']; } 

Выходы:

в этом..

бар, вызванный из foo

foo вызван из бара

Почему вы просто не используете OO и не объявляете свой метод / функцию приватным?

Если вы начнете разбрызгивать эти get_callee () по всему вашему коду, вы создаете ужасный kludge.

Xdebug предоставляет несколько полезных функций.

 <?php Class MyClass { function __construct(){ $this->callee(); } function callee() { echo sprintf("callee() called @ %s: %s from %s::%s", xdebug_call_file(), xdebug_call_line(), xdebug_call_class(), xdebug_call_function() ); } } $rollDebug = new MyClass(); ?> 

вернет трассировку

 callee() called @ /var/www/xd.php: 16 from MyClass::__construct 

Чтобы установить Xdebug на ubuntu, лучший способ

 sudo aptitude install php5-xdebug 

Возможно, вам придется сначала установить php5-dev

 sudo aptitude install php5-dev 

больше информации