Как я могу получить вызов в 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