Возможный дубликат:
Функция 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
больше информации