2013-08-02 20 views
6

Rozważmy następujący (uproszczony do gołych kości):PHP Ternary Operator sprawdza czy zmienna zawiera coś?

abstract class Validator {  

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


$validation = new PageValidator($data); 

„Wejście :: wszystko” wraca tablicę. $ data jest także tablicą.

Bit walczę o to:

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

myślę, że jest to w zasadzie robi:

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

Ale ja naprawdę nie rozumiem w jaki sposób?

+0

Tak, to właśnie robi, jeśli używasz PHP 5.3 lub nowszego. Jeśli używasz PHP <5.3, musisz napisać '$ this-> data = $ data? $ data: Input :: all(); '. – Crontab

Odpowiedz

0

spróbować tego formularza:

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

To naprawdę nie odpowiada na wszystko. – Izkata

+2

To tak naprawdę nie odpowiada na pytanie OP, ani nie pomaga "zrozumieć", dlaczego tak jest. – newfurniturey

6

Jest to feature of PHP 5.3 i powyżej:

Operator trójargumentowy teraz ma skróconą formę: ?:.

+0

Genius;) więc czy wywołanie if ($ data) zwraca false, jeśli $ data = null? Nie trzeba używać isset()/empty()? – dopey

+0

Zwróci false, ale wyda niezdefiniowane ostrzeżenie o zmiennej, jeśli dane $ nie były wcześniej używane. dlatego używa się metody isset(), która pomija ostrzeżenie i działa jako test "czy ta zmienna faktycznie istnieje". –

+0

@dopey @Mark B powiedział, że jeśli '$ data' ma wartość null, zwróci false, ale z ostrzeżeniem. Zobacz [to] (http://stackoverflow.com/a/5164993/2612112), aby uzyskać więcej informacji. – federicot

5

Twoje zrozumienie ternary operator jest poprawne.

Dokładna składnia już pokazały, że pomija środkowa część operatora została funkcja dodana w PHP 5.3:

Od PHP 5.3, możliwe jest, aby opuścić środkową część operatora potrójnego . Wyrażenie wyrażenie1?: Wyrażenie3 zwraca wyrażenie1, jeśli wyrażenie1 wylicza wartość PRAWDA, a wyrażenie3 w przeciwnym wypadku.

pełnej ekspresji, bez pominięcia jest:

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

co przekłada się na to, co już zakłada:

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

?: jest skrótem dla operatora potrójnego od PHP 5.3

Tak, ?: jest jak || jest dla javascript w następującym przypadku:

var myVar = var1 || var2

Jeśli var1 oceniana jest na true, myVar będzie to jeden, inaczej var2.

Uwagi:

0, '', false i null są oceniane na false, więc jeśli masz następujące elementy:

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

Dostaniesz "someVal" jako wynik.

W takich przypadkach należy użyć isset lub empty.