2011-08-31 21 views
9

Powiel możliwe:
Why do some experienced programmers write expressions this way?Czy jest jakaś korzyść z używania wartości null w PHP?

Jestem tylko ciekaw o tym: w większości frameworków/projektów opensource Uczyłam się, często postrzegane kod jak to ...

<?php 

if (null === self::$_instance) { 
    self::$_instance = new self(); 
} 

W szczególności ta linia ...

if (null === self::$_instance) { 

Dlaczego używać null w pierwszym argumencie rachunku if zamiast odwrotnie? ...

if (self::$_instance === null) { 

Zdaję sobie sprawę, prawdopodobnie nie ma wzrost wydajności lub coś podobnego. Czy to tylko preferencja, czy jest to jakiś standard kodowania, którego przeoczyłem?

+2

Osobiście jestem skłonny powiedzieć, że wszystkie powinny być 'if (! Self siebie} $ _ instance)' – cwallenpoole

+0

Jeśli to nie dup, zjem moją klawiaturę –

+5

Ten styl notacji jest znany jako "wyrażenia yoda "lub" warunki yoda ". – mario

Odpowiedz

12

Zapobiega to przypadkowemu przypisanie wartości do zmiennej, zwłaszcza, gdy tylko za luźne porównanie typu (==):

if (self::$_instance = NULL) { … } // WHOOPS!, self::$_instance is now NULL 

Ten styl warunkach często jest nazywany yoda conditions. Wydajność nie ma różnicy, oba stwierdzenia są równoważne.

0

To nie jest szczególnie do null - Widziałem wiele programiści wolą pisać ich wyrażenia w ten sposób okrągłe:

if(8 == 4 * 2) { 

To tylko preferencja które niektórzy ludzie myślą jest wyraźniejszy.

+0

To nie jest warunek, to zadanie, które się nie powiedzie;) Pewnie, że po prostu wpadłeś. – Layke

+0

to jest błąd w czasie kompilacji, nie można przypisać wartości do 8 – knittl

+2

@Layke: to jest dokładnie powód, dla którego można by napisać to na odwrót: literówki zmieniają się w błędy kompilacji – knittl

6

to głównie, aby zapobiec przypadkowemu Zadanie:

if (self::$_instance = null) ... //oops! 
4

Nie ma istotnej różnicy wydajności. Zwykłą zaletą pisania wyrażeń w ten sposób jest programowanie defensywne. Chcemy uniknąć przypadkowego użycia przypisania zamiast porównania równości:

if (self::$_instance = null) { ... 

Woops!

+0

Wow, trzy praktycznie identyczne jednoczesne odpowiedzi. Ktoś jest winien colę. –

3

Ma to pomóc w poprawnym kodzie.

Jeśli to zrobisz, Twój kod będzie działać, ale efekt będzie daleki od tego, co chcesz:

if (self::$instance = null) { 

Warunkowe zawsze niepowodzeniem (ponieważ operator = zwraca zestaw wartości, a to jest falsy), ale self::$instance zostanie teraz ustawiony na null. To nie jest to, czego chcesz.

Jeśli to zrobić:

if (null = self::$instance) { 

Twój kod nie działa, ponieważ nie można używać null (lub jakiegokolwiek dosłowne takiego jak łańcuch lub liczba całkowita) po lewej stronie- zadanie. Jedynie zmienne mogą być lewostronną operacją operatora =.

Jeśli więc błędnie wpiszesz == jako =, pojawi się błąd analizy, a Twój kod całkowicie nie działa. Jest to lepsze rozwiązanie niż mistyfikacyjny i trudny do zlokalizowania błąd.

Powiązane problemy