?? zwraca wartość po lewej, jeśli istnieje i nie jest null, w przeciwnym razie wartość po prawej: $name = $_GET['name'] ?? 'Guest';. W przeciwieństwie do bezpośredniego odczytu klucza nigdy nie ostrzega, gdy brakuje zmiennej albo klucza tablicy.
Przy pierwszym uruchomieniu nie ma query stringa, więc użyte są obie wartości domyślne. Kliknij link na karcie Page, a skrypt wykona się ponownie z wypełnionym $_GET. Odczyt $_GET["name"] bez ?? przy tym pierwszym uruchomieniu wypisałby w zwykłej konfiguracji PHP Warning: Undefined array key "name". Więcej o danych żądania jest na stronie o _POST.
?? to krótkie sprawdzenie isset()
$a ?? $b oznacza dokładnie isset($a) ? $a : $b. Działa na zmiennych, kluczach tablic na dowolnej głębokości i właściwościach obiektów i zatrzymuje się bez skargi na pierwszym brakującym elemencie.
To samo sprawdzenie wykonuje isset, więc klucz, który istnieje z wartością null, też dostaje wartość domyślną.
Łańcuch ?? do sprawdzenia kilku źródeł
?? jest prawostronnie łączny i możesz połączyć dowolnie wiele operatorów. PHP zwraca pierwszy operand, który jest ustawiony i nie jest null.
??= przypisuje tylko przy null
$a ??= $b zapisuje $b w $a tylko wtedy, gdy $a nie jest ustawione albo ma wartość null. To najkrótszy sposób na uzupełnienie wartości domyślnych albo jednorazowe obliczenie czegoś i ponowne użycie.
Prawa strona ??= jest obliczana tylko wtedy, gdy przypisanie następuje, dlatego computing 4 pojawia się raz.
?? vs ?: (skrócony operator trójargumentowy)
?? sprawdza null. ?: sprawdza prawdziwość. Przy wartościach takich jak 0, "" i "0" dają różne odpowiedzi:
Ilość "0" to prawdziwe dane wejściowe: ?? ją zachowuje, ?: zastępuje. Samo ?: ostrzegłoby o brakującym kluczu, dlatego blok zapisuje je jako ($inputs[$key] ?? null) ?: .... Sam ?: opisuje strona o operatorze trójargumentowym.
Operator nullsafe ?->
?-> to wersja tego samego pomysłu dla obiektów, dodana w PHP 8. Jeśli obiekt po lewej to null, cały łańcuch się zatrzymuje i zwraca null zamiast rzucać Error w rodzaju Call to a member function getAddress() on null. Na końcu dodaj ??, aby mieć wartość domyślną.
Użytkownik 2 istnieje, ale nie ma adresu, a użytkownik 3 w ogóle nie istnieje. Obaj docierają do wartości domyślnej ?? "unknown" bez błędu.
Częsty błąd: ?? ma niski priorytet
?? wiąże słabiej niż . i operatory arytmetyczne. Dlatego w "Count: " . $count ?? 0 PHP najpierw buduje łańcuch "Count: " . $count, który nigdy nie jest null, a wartość domyślna nigdy nie zostaje użyta.
Obejmij wyrażenie z ?? nawiasami, gdy tylko stoi w większym wyrażeniu.
Najczęściej zadawane pytania
Co oznacza ?? w PHP?
?? to operator null coalescing. $a ?? $b zwraca $a, jeśli istnieje i nie jest null, w przeciwnym razie $b. To skrót od isset($a) ? $a : $b i nie zgłasza ostrzeżenia, gdy $a albo klucz tablicy nie jest zdefiniowany.
Czym różni się ?? od ?: w PHP?
?? sięga po wartość zastępczą tylko wtedy, gdy lewa strona to null albo nie jest ustawiona, więc 0 ?? 5 daje 0, a '' ?? 'x' daje ''. ?: sięga po nią zawsze, gdy lewa strona jest fałszywa, więc 0 ?: 5 daje 5. ?: ostrzega też o niezdefiniowanych zmiennych i kluczach, ?? nie.
Co robi ??= w PHP?
$a ??= $b przypisuje $b do $a tylko wtedy, gdy $a to null albo nie jest ustawione; w przeciwnym razie zostawia $a bez zmian. To skrót od $a = $a ?? $b;, dodany w PHP 7.4.
Co to jest operator nullsafe ?-> w PHP?
$obj?->method() wywołuje metodę tylko wtedy, gdy $obj nie jest null; jeśli jest null, cały łańcuch zwraca null zamiast rzucać błąd. Połącz go z ??, aby mieć wartość domyślną: $user?->getAddress()?->city ?? 'unknown'. Został dodany w PHP 8.0.