2010-08-02 2 views
4

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

, как будто я называю __LINE__ или __FILE__ в функции он будет использовать строку и файл определения функции в .

но я не хочу проходить __LINE__ и __FILE__ в функцию каждый раз.

поэтому, если я задал их как параметры по умолчанию, они исходят из определения функции или откуда она вызывается?

+0

Почему бы не попробовать это самостоятельно? – relet

ответ

4

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

+0

Могу ли я спросить, почему это так плохо? – Hailwood

+1

(1) У debug_backtrace довольно много накладных расходов (2) поведение ваших функций становится непредсказуемым для других разработчиков (декораторы или, возможно, собственные частные/защищенные/общедоступные методы, в зависимости от обстоятельств, будут гораздо более узнаваемыми решениями) (3) функция вырывается из ее собственной сдерживания/независимости, что касается самого верного признака, что что-то не так с дизайном. – Wrikken

+1

@ Hailwood в производственной среде все внутренние детали, содержащиеся в nitty-gritty, должны регистрироваться, а не отображаться пользователю. вот о чем говорит Wrikken. И для целей отладки есть функция, называемая 'trigger_error', которая, к счастью, автоматически добавит файл и строку, выводя сообщение об ошибке в соответствии с текущими настройками обработки ошибок - для отображения или файла журнала. очень удобно –

4

Выполнение того, что вы предлагаете, похоже, не работает.

Вы можете сделать это так, но я не уверен, почему вы хотите это сделать и что нет лучшего подхода к тому, чего вы пытаетесь достичь - см. Wrikken's answer.

<?php 

function test() { 
    $backtrace = debug_backtrace(); 
    $last = $backtrace[0]; 
    echo "{$last['function']}() called from {$last['file']} line {$last['line']}\r\n"; 
} 



test(); 
-1

Если вы хотите использовать эту информацию в каком-либо сообщении об ошибке, есть функция trigger_error(), которая будет вызывать встроенную ошибку PHP, поэтому, это будет отображаться обычным образом PHP - с именем файла, номером строки и предоставленным текст.

Наиболее полезная особенность этой функции ведет себя в соответствии с текущими настройками обработки ошибок:

ini_set('display_errors',1); 
trigger_error("Horrible bug found!"); 

будет печатать непосредственно на экран сообщение об ошибке, как это:

Notice: Horrible bug found! in /path/file.php on line 2 

очень удобно для разработки
, в то время как данный код

ini_set('display_errors',0); 
ini_set('log_errors',1); 
trigger_error("Horrible bug found!"); 

будет введен в журнал ошибок для дальнейшего использования
обязательным для производства

0

Это так поздно, но, может быть, может быть полезным, вы можете использовать get_called_class(), для имени класса, который называется, и не проходят как параметр insted CLASS.

Смежные вопросы