2013-08-02 16 views
6

Si consideri il seguente (semplificato alle ossa nude):PHP Ternario Operatore che verifica se la variabile contiene qualcosa?

abstract class Validator {  

    public function __construct($data = null) 
    { 
     $this->data = $data ?: Input::all(); 
    } 
} 


$validation = new PageValidator($data); 

'ingresso :: tutti' restituisce un array. $ data è anche una matrice.

Il bit sto lottando con è:

$this->data = $data ?: Input::all(); 

penso che è essenzialmente facendo questo:

if(!$data) { 
     $this->data = Input::all(); 
    } else { 
     $this->data = $data; 
    }; 

Ma io non capisco come?

+0

Sì, questo è quello che fa se si utilizza PHP 5.3 o superiore. Se stai usando PHP <5.3, devi scriverlo '$ this-> data = $ data? $ data: Input :: all(); '. – Crontab

risposta

0

provare questo modulo:

$this->data = $data ? $data : Input::all(); 
+2

Questo in realtà non risponde nulla – Izkata

+2

Questo in realtà non risponde alla domanda dell'OP, o aiuta a "capire" perché è il caso. – newfurniturey

6

E 'un feature of PHP 5.3 e soprattutto:

L'operatore ternario ora ha una forma abbreviata: ?:.

+0

Genius;) quindi chiama if ($ data) restituisce false if $ data = null? Non è necessario usare isset()/empty()? – dopey

+0

restituirà false, ma emetterà anche un avviso di variabile non definita se $ data non è stata precedentemente utilizzata. è per questo che viene usato isset() - ignora l'avviso e agisce come un test "questa variabile esiste realmente". –

+0

@dopey Come @Mark B ha detto, se '$ data' è nullo restituirà falso ma con un avvertimento. Vedi [this] (http://stackoverflow.com/a/5164993/2612112) per ulteriori informazioni. – federicot

5

La tua comprensione di ternary operator è corretta.

La sintassi esatta avete dimostrato che omette la parte centrale del operatore è stato una caratteristica aggiunto in PHP 5.3:

Dal PHP 5.3, è possibile lasciare fuori la parte centrale l'operatore ternario . Espressione expr1?: Expr3 restituisce expr1 se expr1 restituisce TRUE ed expr3 in caso contrario.

L'espressione completa, senza omissioni, è:

$this->data = $data ? $data : Input::all(); 

che si traduce in quello che hai dato per scontato:

if($data) { 
    $this->data = $data; 
} else { 
    $this->data = Input::all(); 
} 
2

?: è l'abbreviazione di un operatore ternario da PHP 5.3

Quindi, ?: è come || è per javascript nel seguente caso:

var myVar = var1 || var2

Se il var1 viene valutata a true, myVar sarà questo, altrimenti var2.

Note:

0, '', false e null sono valutati su false, quindi se avete il seguente:

$data = 0; 
$this->data = $data ?: 'someVal'; 
echo $this->data; 

Otterrete "someVal" come risultato.

In questi casi utilizzare isset o empty.