2012-06-14 11 views
36

Ho programmato script personali per anni in PHP e mi sono abituato a disattivare la visualizzazione degli errori. Sto per rilasciare alcuni di questi script e mi piacerebbe farlo nel modo giusto.Modo corretto per dichiarare più vars in PHP

L'unico motivo per cui spengo la visualizzazione degli errori è evitare di dover testare ogni singola var, prima di usarla, grazie a isset().

Quindi, ecco la mia domanda:

C'è un modo migliore per dichiarare più Vars rispetto a questo?

<?php 
    // at the begining of my main file 
    if (!isset($foo)) ($foo = ''); 
    if (!isset($bar)) ($bar = ''); 
    if (!isset($ping)) ($ping = ''); 
    if (!isset($pong)) ($pong = ''); 
    // etc. for every single var 
?> 

Qualcosa di simile, per esempio:

<?php 
    var $foo, $bar, $ping, $pong; 
?> 
+3

Mi sembra strano che 'var $ foo' sia una stringa vuota. Quali operazioni stai facendo in seguito che sta causando problemi? –

+2

Non capisco di cosa si tratta. Stai testando una variabile prima di impostarla per verificare se è possibile impostarla? Vieni da un'altra lingua in cui devi impostare variabili come 'dim d as Integer'? Penso che ciò di cui hai veramente bisogno è un po 'di incapsulamento come funzioni, classi, ecc., Così sei fuori dallo spazio dei nomi globale, e poi prendi l'abitudine di dichiarare le variabili all'inizio di ogni metodo di funzione/classe. –

+0

@MikeB: un semplice test. Se la var non viene dichiarata al primo posto, un semplice 'if ($ pippo == 'blabla')' richiederà un errore. –

risposta

7

tuo if() con isset() tentativo è il modo corretto di farlo!

Ma si può scrivere un po 'più breve/più leggibile, utilizzando il Ternary Operator:

$foo = isset($foo) ? $foo : ''; 

La prima $foo sarà impostato al valore dopo la ? quando la condizione dopo la = è vero, il resto sarà impostato sul valore dopo lo :. La condizione (tra = e ?) verrà sempre impostata come booleana.

Dal PHP 5.3 si può scrivere ancora più breve:

$foo = isset($foo) ?: ''; 

Questo imposterà $foo-TRUE o FALSE (a seconda di cosa isset() rendimenti), come sottolineato dalla @Decent Dabbler nei commenti. La rimozione di isset() lo imposterà su '' ma genererà anche un avviso variabile non definito (non in produzione però).

Dal PHP 7 è possibile utilizzare un operatore nullo fondono:

$foo = $foo ?? ''; 

Questo non genererà alcun errore, ma sarà valutare come TRUE se $foo esiste ed è vuota, in contrapposizione al ternario stenografia operatore, che valuterà come FALSE se la variabile è vuota.

+1

Domanda onesta, perché vuoi avere '$ pippo' essere una stringa vuota vs null? Sto andando in tondo cercando di venire fuori con una circostanza –

+0

Sono sicuro che l'interrogante vuole semplicemente impostare un valore predefinito, in questo caso una stringa vuota. E ricorda ""! = NULL o non impostato ;-) – powtac

+0

Non lo so, sono con @MikeB, sono stato uno sviluppatore PHP in recupero da otto anni e non ho mai fatto sistematicamente qualcosa di simile questo, o ha avuto un problema non farlo? –

5

Un modo un po 'arrotondato per farlo è se si inserisce il nome delle variabili in un array e quindi si esegue il ciclo con un operatore ternario, simile alla risposta di powtac.

$vars = array('foo', 'bar', 'ping', 'pong'); 
$defaultVar = ''; 

foreach($vars as $var) 
{ 
    $$var = isset($$var) ? $$var : $defaultVar; 
} 

Come accennato in altre risposte, a partire dalla versione 5.3, PHP consente di scrivere il codice precedente come segue:

$vars = array('foo', 'bar', 'ping', 'pong'); 
$defaultVar = ''; 

foreach($vars as $var) 
{ 
    $$var = isset($$var) ?: $defaultVar; 
} 

Nota Ternario Operatore cambiato.

0

Perché non basta impostarli?

<?php 
$foo = ''; 
$bar = ''; 
//etc 
?> 

Se si sta cercando di conservare il valore in esse, allora sì, in generale è il modo corretto. Si noti che non è necessario il secondo paio di parentesi nelle dichiarazioni:

if (!isset($foo)) $foo = ''; 

è sufficiente.

+0

A causa di 'isset' nella domanda, penso che l'OP indichi che esiste la possibilità che le variabili abbiano già un valore impostato su di esse. –

+2

se dovessi semplicemente impostare, farei: $ foo = $ bar = $ ping = $ pong = ''; – pocketfullofcheese

+0

@pocketfullofcheese - Perché non lo aggiungi come risposta (cosa che so è corretta)? –

65
<?php 
    $foo = $bar = $ping = $pong = ''; 
?> 

Se è la sceneggiatura e si sa che le variabili in cui si usa, perché si vuole spendere resourses per verificare se la variabile è stata dichiarata befor?

+11

Inoltre, se vuoi semplicemente "dichiararli" per qualche motivo, puoi metterli tutti su una riga con ';', come in '$ pippo; $ Bar; $ Lontano; $ boo; ', tutto su una riga.Nota per i non iniziati, '$ pippo, $ bar, $ lontano, $ boo;' genera un errore di sintassi (analisi), uccidendo lo script. –

+1

@JaredFarrish '$ pippo; $ Bar; $ Lontano; $ boo; 'getterà ancora' Avviso: variabile indefinita: ... ' –

9

Ho postato questo in un commento in precedenza, ma qualcuno mi ha suggerito di inviarlo come risposta.

La via più breve e più semplice mi viene in mente, è quello di fare:

$foo = $bar = $ping = $pong = ''; 

spesso preferisco impostare le cose false, invece di una stringa vuota, in modo che si può sempre fare i controlli in futuro con === false, ma questa è solo una preferenza e dipende da come stai usando queste variabili e per cosa.

-3

$ a = ['foo', 'bar', 'ping', 'pong']; foreach ($ a as $ v) $$ v = '';

//

;)

0

per risolvere il problema di

<?php 
    $foo = $bar = $ping = $pong = ''; 
    ?> 

gettando

Avviso: Variabile non definita: ...

<?php 
    @$foo = $bar = $ping = $pong = ''; 
    ?> 

Sarà non aggiustarlo ma non verrà mostrato e non si fermerà lo script dall'analisi.

Problemi correlati