Определите, где была вызвана функция с PHP

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

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

Итак, какие существуют другие альтернативы?

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

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

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

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

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

Некоторое время назад я заимствовал этот код откуда-то, и он работает как шарм, используя 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; } 

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

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

 $bt = debug_backtrace(); $end = end($bt); var_dump($end['class']); //or var_dump($end['file']); 

У вас не будет много вариантов. Другой вариант (который был отправлен в другом вопросе), чтобы заставить вызывающего абонента оформить его информацию с помощью вызова функции (с использованием 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 кода callFunction и было бы довольно сложно отследить эти ошибки.

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

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