вы, ребята, знаете, как я могу определить, из какого файла была функция, называемая внутри этой функции?
Я думал об использовании 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
(даже если он может быть «медленным»). Читаемый код выигрывает по быстрому коду.
Если это для целей отладки, вы можете выбросить исключение и распечатать вызовы функций, где вы его поймаете.