2010-10-12 14 views
8

I parametri di cui sto parlando sono __FILE__ e __LINE__ - quelli del chiamante della funzione, in modo che la funzione possa utilizzarli nella segnalazione degli errori.Posso creare una "macro" PHP (come #define) per fornire i parametri per le chiamate di funzione?

Diciamo che ho due file e la linea 100 di file_1.php chiama my_func() in file_2.php

mi piacerebbe fare quella chiamata my_func(__FILE__, __LINE__) in modo che se my_func incontra un errore può segnalarlo contro file_1 .php alla riga 100.

Lo faccio poiché ci sono centinaia di chiamate a my_func e riportare l'errore in my_func() stesso potrebbe non essere informativo (a meno che non esegua il dump dello stack). E non voglio dover digitare manualmente quei due parametri alcune centinaia di volte.

In C vorrei fare qualcosa come #define MY_FUNC my_func(__FILE, __LINE) - posso fare qualcosa di simile in PHP?

risposta

10

Sfortunatamente, PHP non ha alcun tipo di macro. Potresti implementarli da solo eseguendo uno strumento da riga di comando come sed su alcuni input per inserire macro, ma questo è soggetto a errori e un po 'sciatto.

Per fare ciò che si vuole fare, si può prendere in considerazione la funzione debug_backtrace.

+0

7 o 8 anni dopo, ho trovato questa domanda ancora una volta e ho pensato che avrei usato una combinazione della risposta di Mojtab per le eccezioni, e backtrace come suggerito qui – Mawg

2

No. Utilizzare una traccia dello stack: debug_backtrace(). È possibile recuperare il file e la linea del chiamante, semplicemente guardando la seconda riga nell'array restituito.

2

Sfortunatamente non ci sono macro come C in PHP.

leggere una debug_backtrace è complicato e non mi piace.

Cosa mi piacerebbe lanciare un'eccezione nei punti di errore, quindi oggetto eccezione contiene automaticamente la traccia dello stack, nonché il numero di riga e il file da cui proviene.

catch (Exception $e) 
{ 
    $errorMessage = $e->getMessage() . " LINE: " .$e->getLine(). " FILE: " . $e->getFile(); 
} 
+1

Acquista questa lib https://www.sitepoint.com/ php-macro-for-fun-and-profit / –

2

È possibile replicare macro C-like con l'aiuto della riscrittura del file di origine.

scrittura di file macro.php:

<?php 

$name = $_SERVER['PHP_SELF']; 
$name = preg_replace('#\/#mui', '', $name); 

$file = file_get_contents($name); 

// get defined macros 
preg_match_all('#\#macro\h+(\w+)\h+(.*)$#mui', $file, $matches, PREG_SET_ORDER); 

foreach ($matches as $m) { 
    // delete macro definition 
    $file = str_replace($m[0], '', $file); 
    // substitute macro => value 
    $file = str_replace($m[1], $m[2], $file); 
} 

// save processed file 
$new_name = '/var/tmp/' . $name . '.pr'; 
file_put_contents($new_name, $file); 

include_once $new_name; 
exit; 

Ora, con tale strumento, l'utilizzo è semplice:

<?php 

include_once "macro.php"; 

#macro DEBUG_INFO ;echo('<b> DEBUG_INFO: __FILE__ : ' . __FILE__ . ';__LINE__ : ' . __LINE__ . '</b>') 

echo '<br>'.(1/2); DEBUG_INFO; 
echo '<br>'.(1/0); DEBUG_INFO; 
echo '<br>'.(0/0); DEBUG_INFO; 

quando le uscite effettuate:

0,5 DEBUG_INFO: FILE:/var /tmp/test.php.pr; LINE: 7

INF DEBUG_INFO: FILE: /var/tmp/test.php.pr; LINE: 8

NAN DEBUG_INFO: FILE: /var/tmp/test.php.pr; LINE: 9

Ho forte background C e sempre mancate le macro-C come in PHP. Ma speriamo di poter iniettare una sorta di ricambio per questo.

Problemi correlati