Czy jest jakaś różnica między tym ...
if (is_null($var)) {
do_something();
}
i to?
if ($var === null) {
do_something();
}
Która forma jest lepsza podczas sprawdzania, czy zmienna zawiera wartość null? Czy są jakieś skrajne przypadki, o których powinienem wiedzieć? (Inicjalizuję wszystkie moje zmienne, więc nieistniejące zmienne nie stanowią problemu).
===
operator byłby szybszy, ponieważ nie jest to jawna funkcja ... ale raz czy dwa byłem zaskoczony.Odpowiedzi:
Pod warunkiem, że zmienna jest zainicjalizowana (co wskazałeś - chociaż nie jestem w 100% pewien, czy to ma znaczenie w tym kontekście, czy nie. Oba rozwiązania mogą generować ostrzeżenie, jeśli zmienna nie została zdefiniowana), funkcjonalnie są takie same. Przypuszczam,
===
że byłby nieznacznie szybszy, ponieważ usuwa narzut wywołania funkcji.To naprawdę zależy od tego, jak patrzysz na swój stan.
===
służy do ścisłego porównania danych. NULL ma tylko jedną `` wartość '', więc działa to przy porównywaniu z NULL (która jest stałą PHP o wartości null)is_null
sprawdza, czy zmienna ma typ danych NULL.Tak naprawdę to od Ciebie zależy, co wybierzesz.
źródło
is_null
wariant, bo== null
zamiast niego łatwo go przypadkowo użyć=== null
. Ponieważ== null
jest to to samo, coempty
(zobacz inną odpowiedź), wprowadza to większy potencjał błędu programisty (zwłaszcza młodszego i średniego poziomu) niż prosty i czytelnyis_null
.✅
jesttrue
❌
jestfalse
| isset | is_null | ===null | ==null | empty | |-------|---------|---------|---------|---------|---------| | null | ❌ | ✅ | ✅ | ✅ | ✅ | | true | ✅ | ❌ | ❌ | ❌ | ❌ | | false | ✅ | ❌ | ❌ | ✅ | ✅ | | 0 | ✅ | ❌ | ❌ | ✅ | ✅ | | 1 | ✅ | ❌ | ❌ | ❌ | ❌ | | \0 | ✅ | ❌ | ❌ | ❌ | ❌ | | unset | ❌ | ✅ | ✅ | ✅ | ✅ | | "" | ✅ | ❌ | ❌ | ✅ | ✅ |
Podsumowanie: 🔸 ♦ ️🔸
empty
jest równa==null
is_null
jest równa===null
isset
jest odwrotnościąis_null
i===null
źródło
$v
reprezentować pewną zmienną rodzajowe, a potem inniisset($v)
,is_null($v)
,$v===null
i tak dalejisset
nie będzie narzekać na niezdefiniowaną zmienną, zwróci false. Użycieis_null
lub=== null
spowoduje powiadomienie.Oba są dokładnie takie same, używam,
is_null
ponieważ sprawia, że mój kod jest bardziej czytelnyźródło
is_null
jest mniej jasne. Chociaż może ładnie czytać,$v === null
nie pozostawia wątpliwości, że porównanie jest wykonywane przy użyciu ścisłej semantyki, aleis_null($v)
niektórzy programiści będą się zastanawiać, czy używa,===
czy==
semantyki.is_null
można je całkowicie usunąć lub przedefiniować , ale=== null
zawsze będzie działać.Jeśli wydaje się, że tak wiele funkcji typu is_foo () wydaje się zbędne dla php, kiedy możesz po prostu użyć standardowych operatorów porównania, rozważ funkcje nazywane programowo.
$arrayOfNullValues = array_filter($myArray, 'is_null');
źródło
$arrayWithoutNullValues
będzie przechowywać tablicę zawierającą tylkonull
wartości.Właśnie przeprowadziłem szybki test porównawczy, testując milion iteracji każdego.
is_null
zajęło 8 sekund;=== null
wziął 1.Tak więc połączenie z
is_null
numerem jest o 0,000007 s wolniejsze niż połączenie===
na moim komputerze.Znalazłbym coś bardziej przydatnego do optymalizacji.
Mój kod:
<?php $start = time(); $var = null; for ($i = 1000000; $i--; ) { is_null($var); } echo time() - $start; $start = time(); for ($i = 1000000; $i--; ) { $var === null; } echo time() - $start;
źródło
is_null()
jest nieco szybszy na moim komputerze pod 7.1.9 Win32.Za każdym razem korzystałbym z wbudowanej funkcji PHP zamiast porównania operatorów.
źródło
is_null($var)
jest około 14 razy wolniejszy niż$var===null
... 37,8 ms vs. 2,6 ms.Ale właściwie nie wiem dlaczego.
źródło
Jedną rzeczą, o której ludzie często zapominają w tej dyskusji, jest to, że jeśli zależy ci na ścisłym sprawdzaniu typu,
is_null
pomoże ci to nigdy nie popełniać literówki w operatorach porównania (== vs ===).źródło