Определите, где функция была вызвана с PHP - PullRequest
5 голосов
/ 13 апреля 2009

вы, ребята, знаете, как я могу определить, из какого файла была функция, вызванная внутри этой функции?

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

Так какие еще есть альтернативы?

Большое спасибо

Ответы [ 5 ]

3 голосов
/ 16 февраля 2010

Ответы от команды Микки Мауса типичны для онлайн-сообщества PHP! Вместо того, чтобы делиться ответом, они спрашивают, зачем он вам нужен. Не берите в голову тот факт, что solomongaby задает правильный вопрос, и это вполне нормальная функция, имеющаяся в стандартных IDE и более профессиональных языках, таких как Java и Objective-C.

Solomongaby, это самый простой способ получить то, что вам нужно:

$bt = debug_backtrace();
$end = end($bt);
var_dump($end['class']); //or var_dump($end['file']);
3 голосов
/ 13 апреля 2009

Я заимствовал этот код некоторое время назад откуда-то, и он работает как талисман, используя debug_backtrace () . Надеюсь, вы найдете это полезным:

function backtrace(){
    $backtrace = debug_backtrace();

    $output = '';
    foreach ($backtrace as $bt) {
        $args = '';
        foreach ($bt['args'] as $a) {
            if (!empty($args)) {
                $args .= ', ';
            }
            switch (gettype($a)) {
                case 'integer':
                case 'double':
                    $args .= $a;
                    break;
                case 'string':
                    //$a = htmlspecialchars(substr(, 0, 64)).((strlen($a) > 64) ? '...' : '');
                    $args .= "\"$a\"";
                    break;
                case 'array':
                    $args .= 'Array('.count($a).')';
                    break;
                case 'object':
                    $args .= 'Object('.get_class($a).')';
                    break;
                case 'resource':
                    $args .= 'Resource('.strstr($a, '#').')';
                    break;
                case 'boolean':
                    $args .= $a ? 'TRUE' : 'FALSE';
                    break;
                case 'NULL':
                    $args .= 'Null';
                    break;
                default:
                    $args .= 'Unknown';
            }
        }
        $output .= '<br />';
        $output .= '<b>file:</b> '.@$bt['file'].' - line '.@$bt['line'].'<br />';
        $output .= '<b>call:</b> '.@$bt['class'].@$bt['type'].@$bt['function'].'('.$args.')<br />';
    }
    return $output;
}
2 голосов
/ 13 апреля 2009

Из функции debug_backtrace() это единственный способ определить вызывающего, если, конечно, вы не передадите эту информацию в качестве параметра.

Обратите внимание, что вы не можете использовать для этого значения по умолчанию. E.g.:

function f($param1, $param2, $caller=__FUNCTION__) ...

__FUNCTION__ будет оцениваться во время разбора, поэтому оно всегда будет иметь одинаковое значение. Функция, в которой объявляется область действия f.

1 голос
/ 13 апреля 2009

У вас не будет много вариантов там. Другой вариант (который был опубликован в другом вопросе), чтобы заставить вызывающего пользователя предоставлять информацию с помощью вызова функции (используя магические константы PHP):

callFunction(1, 2, 3, __FUNCTION__)
callFunction(1, 2, 3, __CLASS__,  __METHOD__)
callFunction(1, 2, 3, $this,  __METHOD__)

  or

$class = new ReflectionClass( __CLASS__ ); 
$method = $class->getMethod( __METHOD__ );
callFunction(1, 2, 3, $method) // $method would be a ReflectionMethod obj

будет возможной альтернативой. Но это

  • запутывает ваш код
  • можно «манипулировать», что может привести к сбою кода callFunction, и будет довольно сложно отследить эти ошибки.

Если бы я был на вашем месте, я бы попытался избежать этого в функции, которая используется в вашем коде. используйте debug_backtrace (даже если это может быть «медленно»). Читаемый код выигрывает у быстрого кода.

0 голосов
/ 13 апреля 2009

Если это для целей отладки, вы можете выбросить исключение и распечатать стек вызовов функций там, где вы его перехватите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...