2012-03-02 13 views
12

Sto provando a definire una costante, ma non voglio ridefinirla se è già stata definita. Ecco un esempio C:PHP ha un equivalente di #ifdef di C/C++?

#ifndef BASEPATH 
#define BASEPATH /mnt/www 
#endif 

Qual è il modo più elegante per fare questo in PHP?

+1

http://php.net/manual/en/function.defined.php – j08691

+0

Tecnicamente, no, poichè 'define' /' defined' di PHP sono valutati in ** runtime ** (i PHP sono quasi gli stessi di variabili), e non esiste un preprocessore ** (incorporato) ** che sia in grado di disabilitare un gruppo di righe di codice senza valutare la sua correttezza della sintassi (ad esempio, disabilitando il codice sintatticamente sbagliato con PHP 'if (definito (...)) 'non aiuterebbe). – leemes

risposta

23

Utilizzare defined() e define().

if (!defined('BASEPATH')) { 
    define('BASEPATH', '/mnt/www'); 
} 
+2

Bello! Quello su cui mi sono stabilito è questo (tutto in una riga): 'defined ('BASE_PATH') || define ('BASE_PATH', '/ mnt/www /'); 'Se' defined() 'è ** true **, il resto del condizionale non viene mai valutato, se' defined() 'restituisce ** false ** , la seconda metà del condizionale viene valutata e viene definito 'BASE_PATH'. – DavidH

4

Usa defined() funzione

if(!defined("constantname")) { 
    define("constantname", "value"); 
} 
1

Uso defined():

<?php 
/* Note the use of quotes, this is important. This example is checking 
* if the string 'TEST' is the name of a constant named TEST */ 
if (defined('TEST')) { 
    echo TEST; 
} 
?> 
1

Si tratta di riscrittura condensata della risposta di Radu sopra (e tutti gli altri).

defined('BASE_PATH') || define('BASE_PATH', '/mnt/www/');  

Questo è tutto. Se defined('BASE_PATH') restituisce true, il resto del condizionale non viene mai valutato. Se restituisce false, viene valutata la seconda metà del condizionale e viene definito BASE_PATH.

+2

Raccomando la versione più lunga, anche se su una riga, poiché la leggibilità aggiunta sarà utile a lungo termine ... 'if (! Defined ('BASE_PATH')) define ('BASE_PATH', '/ mnt/www/'); 'è solo * 3 caratteri * più lungo di questa versione condensata, ed è più che compensato dalla leggibilità. – rid

5

In C, #ifdef implica spesso la scrittura/abilitazione/disabilitazione del codice personalizzato in base alla presenza o meno di una definizione. Sebbene l'OP non stia cercando la risposta che segue, gli utenti dei motori di ricerca potrebbero essere interessati a ottenere una risposta espansa. (Questa domanda mi ha aiutato RTM a trovare la risposta che segue.)

Se uno ha un file .php che è incluso più volte, può essere conveniente dichiarare una funzione solo se non è stata già dichiarata da una precedente inclusione dello stesso file. La convenienza, in questo caso, è mantenere il codice strettamente correlato nello stesso file invece di doverlo inserire in un file include_once .php separato e codice inutilmente separato che non deve essere generalmente riutilizzato in altri contesti (file).

Poiché sembra uno spreco/improprio funzioni ri-dichiarare più volte, si scopre che un # ifdef simile costrutto in PHP è possibile:

if (! function_exists('myfunc')) 
{ 
    function myfunc(...) 
    { 
    ... 
    } 
} 

Dove ... indica la fill-in-the- vuoto.

Vedere anche: function_exists (PHP 4, PHP 5) (con commenti).

+0

Sembra che le variabili globali non siano visibili all'interno di myfunc(), quindi i riferimenti devono essere passati come argomenti (se necessario). – kbulgrien

+0

il tuo codice è sintatticamente errato – zerkms

+0

Sì, avevo un punto e virgola alla fine dell'istruzione if (e ora è sparito) ma '...' sono chiaramente descritti nel corpo della risposta. Il codice è una copia/incolla di qualcosa su un sito web reale, solo ho sostituito gli argomenti e il corpo della funzione con '...' e cambiato il nome della funzione. – kbulgrien

Problemi correlati