2010-03-19 4 views
1

est-il un moyen de raccourci ceci:constantes magiques d'accès dynamique en php

function a($where){ 
    echo $where; 
} 

function b(){ 
    a(basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__); 
} 

à quelque chose comme ceci:

define("__myLocation__", ''.basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__.''); 
    function a($where){ 
     echo $where; 
    } 

    function b(){ 
     a(__mYLocation_); 
    } 

Je sais que cela ne peut être fait avec des constantes (est juste un exemple théorique), mais je n'arrive pas à trouver un moyen d'exprimer mon code. Si vous utilisez une fonction pour obtenir ma ligne, elle aura la ligne où cette fonction n'est pas la ligne d'où la fonction a été appelée.

Je usualy appeler une fonction qui imprime directement sur le fichier journal, mais dans mon journal que je dois savoir où la fonction a été appelée, donc je l'utilise basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__ ce imprimera quelque chose comme:

index.php::b()::6 

Il Il y a beaucoup de code quand vous avez plus de 500 fonctions dans différents fichiers. Y at-il un raccourci ou une meilleure façon de le faire?

+0

est-ce pour les erreurs de connexion? – Gordon

+0

Il sert à tout enregistrer: informations (ce que fait l'utilisateur, s'il change quelque chose à l'application), déboguer des messages (si le débogage est activé), des avertissements et des erreurs. –

+1

Voir ici http://stackoverflow.com/questions/1252529/get-code-line-and-file-thats-executing-the-current-function-in-php – Gordon

Répondre

1

debug_backtrace() devrait vous aider, bien que je ne sache pas ce que l'appel de performance ferait un appel à chaque journal que vous coupez. Essayez ceci:

function cut_log() { 
    $trace = debug_backtrace(); 
    echo basename($trace[1]['file']) . '::' . $trace[1]['function'] 
     . '::' . $trace[1]['line']; 
} 

function a() { 
    cut_log(); 
} 

a(); 
+0

vous ne voulez pas que dans le code de production. – Gordon

+0

@Gordon Comme il se trouve, 'debug_backtrace' n'ajoute pas beaucoup de temps système. Je dirais que si ça marche, utilisez-le. – mattbasta

+0

@mattbasta ce n'est pas l'overhead, c'est par principe. c'est une fonction de débogage, principalement utilisée dans la gestion des erreurs. Il ne doit pas être utilisé à mauvais escient pour obtenir des informations sur un objet appelant, à moins que ce ne soit pour le débogage et que la consignation ne le soit pas. Voir http://stackoverflow.com/questions/346703/php-debug-backtrace-in-production-code et http://www.mail-archive.com/[email protected]/msg43737.html – Gordon

0

Ehh .. Je suppose que vous pourriez le faire avec eval et cette constante.

define("__myLocation__", "''.basename(__FILE__).'::'.__FUNCTION__.'()::'.__LINE__.''"); 
function a($where){ 
    echo $where; 
} 

function b(){ 
    a(eval(__myLocation__)); 
} 

Mais vous ne devriez vraiment pas utiliser eval pour quoi que ce soit.

Questions connexes