Как я могу получить вызов в PHP?
Возможный дубликат:
Функция вызывающего абонента в PHP 5?
Я хотел бы знать, откуда вызывается глобальная функция или публичный метод. Думаю, я мог бы это сделать, проверив debug_backtrace, но я предпочел бы использовать механизм более легкого веса, если он существует. Любые предложения?
Например, что-то вроде этого, если вы представляете функцию get_callee() и константу:
function doSomething() {
if(get_callee() == 'PHP_GLOBAL') { throw new IllegalAccessException(); }
...
}
Ответы
Ответ 1
Изменить: Извините, теперь заметили вашу заметку об 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'];
}
Выходы:
INIT..
bar, вызванный из foo
foo вызван из строки
Ответ 2
Почему вы просто не используете OO и не объявляете свой метод/функцию приватным?
Если вы начнете посыпать эти get_callee() по всему вашему коду, вы создаете ужасный kludge.
Ответ 3
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