Czy ktoś może wyjaśnić różnice między skróconym operatorem trójskładnikowym ( ?:
) a operatorem koalescencji zerowej ( ??
) w PHP?
Kiedy zachowują się inaczej i kiedy w ten sam sposób (jeśli tak się dzieje)?
$a ?: $b
VS.
$a ?? $b
Czy ktoś może wyjaśnić różnice między skróconym operatorem trójskładnikowym ( ?:
) a operatorem koalescencji zerowej ( ??
) w PHP?
Kiedy zachowują się inaczej i kiedy w ten sam sposób (jeśli tak się dzieje)?
$a ?: $b
VS.
$a ?? $b
Kiedy twój pierwszy argument ma wartość NULL, są one w zasadzie takie same, z wyjątkiem tego, że koalescencja NULL nie daje E_NOTICE
wyniku, gdy masz niezdefiniowaną zmienną. Dokumenty dotyczące migracji do PHP 7.0 zawierają następujące informacje:
Operator zerowania koalescencji (??) został dodany jako cukier składniowy w typowym przypadku konieczności używania trójskładnika w połączeniu z isset (). Zwraca swój pierwszy operand, jeśli istnieje i nie ma wartości NULL; w przeciwnym razie zwraca drugi operand.
Oto przykładowy kod, który to pokazuje:
<?php
$a = null;
print $a ?? 'b'; // b
print "\n";
print $a ?: 'b'; // b
print "\n";
print $c ?? 'a'; // a
print "\n";
print $c ?: 'a'; // Notice: Undefined variable: c in /in/apAIb on line 14
print "\n";
$b = array('a' => null);
print $b['a'] ?? 'd'; // d
print "\n";
print $b['a'] ?: 'd'; // d
print "\n";
print $b['c'] ?? 'e'; // e
print "\n";
print $b['c'] ?: 'e'; // Notice: Undefined index: c in /in/apAIb on line 33
print "\n";
Linie, które mają uwagę, to te, w których używam skróconego operatora trójskładnikowego, w przeciwieństwie do zerowego operatora koalescencyjnego. Jednak nawet z tym powiadomieniem PHP udzieli tej samej odpowiedzi.
Wykonaj kod: https://3v4l.org/McavC
Oczywiście zawsze zakłada się, że jest to pierwszy argument null
. Kiedy już nie będzie już zerowy, to kończysz się różnicami w tym, że ??
operator zawsze zwraca pierwszy argument, podczas gdy ?:
stenografia będzie tylko wtedy, gdy pierwszy argument byłby prawdziwy, i to zależy od tego, jak PHP wypisze rzeczy na boolean .
Więc:
$a = false ?? 'f'; // false
$b = false ?: 'g'; // 'g'
byłoby wtedy $a
równe false
i $b
równe 'g'
.
$b = []; var_dump($b['a']['b']['c'] ?? 'default');
lub z obiektami$b = new Foo; var_dump($b->a()->b()->c() ?? 'default');
$a = [];
. Zobacz: 3v4l.org/iCCa0Uruchomiłem poniżej w interaktywnym trybie php (
php -a
na terminalu). Komentarz do każdej linii pokazuje wynik.Oto moja interpretacja:
1. zerowy operator koalescencyjny -
??
:??
jest jak „brama”, która przepuszcza tylko NULL .NULL
.??
że( !isset() || is_null() )
2. Operator trójskładnikowy -
?:
?:
jest jak brama, która pozwalaanything falsy
przepuszcza - w tymNULL
0
,empty string
,NULL
,false
,!isset()
,empty()
.. wszystko, co pachnie falsyecho ($x ? $x : false)
?:
wrzuciPHP NOTICE
na niezdefiniowany (unset
lub!isset()
) zmienne3. Więc doktorze, kiedy używam
??
i?:
...?:
kiedyempty($x)
kontrole!empty($x) ? $x : $y
można skrócić$x ?: $y
if(!$x) { fn($x); } else { fn($y); }
można skrócić dofn(($x ?: $y))
??
kiedy!isset() || is_null()
sprawdzenie$object = $object ?? new objClassName();
4. Operatorzy układający w stos ...
Operator trójskładnikowy można ustawiać w stos ...
Źródło i informacje o tym kodzie
Jest to w zasadzie sekwencja:
Operator zerowy może być ustawiany w stos ...
Jest to sekwencja:
Stosując stosy, mogę skrócić to:
Do tego:
Fajnie, prawda? :-)
źródło
Jeśli użyjesz skrótu trójskładnikowego operatora w ten sposób, spowoduje to powiadomienie, jeśli
$_GET['username']
nie zostanie ustawione:Zamiast tego musisz zrobić coś takiego:
Operator zerowy koalescencyjny jest równoznaczne z powyższym stwierdzeniem, i powróci „default”, jeśli
$_GET['username']
nie jest ustawiona lub jestnull
:Zauważ, że nie sprawdza prawdziwości . Sprawdza tylko, czy jest ustawiony, a nie zerowy.
Możesz to również zrobić, a pierwsza zdefiniowana (ustawiona i nie
null
) wartość zostanie zwrócona:Teraz jest to właściwy operator koalescencyjny.
źródło
Główną różnicą jest to
Wyrażenie operatora trójskładnikowego
expr1 ?: expr3
zwraca wartość,expr1
jeśli jestexpr1
przetwarzane,TRUE
ale z drugiej strony wyrażenie operatora zerowego koalescencji(expr1) ?? (expr2)
ocenia,expr1
jeśli nieexpr1
jestNULL
Operator trójskładnikowy wysyła
expr1 ?: expr3
powiadomienie, jeśli wartość po lewej stronie(expr1)
nie istnieje, ale z drugiej strony zerowy operator koalescencyjny(expr1) ?? (expr2)
W szczególności nie wysyła powiadomienia, jeśli wartość po lewej stronie(expr1)
nie istnieje, podobnie jakisset()
.TernaryOperator pozostaje asocjacyjny
Operator zerowego koalescencji ma rację asocjacji
Teraz wyjaśnijmy różnicę między przykładami:
Operator trójskładnikowy
(?:)
Zerowy operator koalescencyjny
(??)
Oto tabela wyjaśniająca różnicę i podobieństwo między
'??'
i?:
źródło
Oba zachowują się inaczej, jeśli chodzi o dynamiczne przetwarzanie danych.
Jeśli zmienna jest pusta (''), koalescencja zerowa potraktuje zmienną jako prawdziwą, ale skrócony operator potrójny nie. I o tym należy pamiętać.
A wynik:
Link: https://3v4l.org/ZBAa1
źródło
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand
.Oba są skrótami dla dłuższych wyrażeń.
?:
jest skrótem od$a ? $a : $b
. To wyrażenie ma wartość $ a, jeśli $ a ma wartość PRAWDA .??
jest skrótem odisset($a) ? $a : $b
. To wyrażenie będzie miało wartość $ a, jeśli $ a jest ustawione, a nie null.Ich przypadki użycia pokrywają się, gdy $ a jest niezdefiniowany lub ma wartość null. Gdy $ a jest niezdefiniowane
??
, nie wygeneruje E_NOTICE, ale wyniki są takie same. Gdy $ a jest zerowe, wynik jest taki sam.źródło
Dla początkujących:
Zerowy operator koalescencyjny (??)
Wszystko jest prawdą, z wyjątkiem
null
wartości i niezdefiniowanych (zmienna / indeks tablicy / atrybuty obiektu)dawny:
jest to w zasadzie sprawdzenie, czy zmienna (indeks tablicy, atrybut obiektu .. itd.) istnieje i nie istnieje
null
. podobny doisset
funkcjiSkrócony operator trójskładnikowy (? :)
co fałszywe rzeczy (
false
,null
,0
, pusty łańcuch) są przyjść jako fałszywe, ale jeśli jest to niezdefiniowane pochodzić również jako fałszywe, aleNotice
rzucidawny
Mam nadzieję że to pomoże
źródło
Przewiń w dół ten link i wyświetl sekcję, daje to porównawczy przykład, jak pokazano poniżej:
Nie zaleca się jednak łączenia łańcuchów operatorów, ponieważ utrudnia to zrozumienie kodu podczas jego późniejszego czytania.
Zasadniczo użycie operatora koalescencyjnego sprawi, że będzie ono automatycznie sprawdzać wartość zerową w przeciwieństwie do operatora trójskładnikowego.
źródło
a || b || c
wzorca w JS, z wyjątkiem tego, że PHP może być użyte do logów (false || 2
w JS jest 2;false ?? 2
w PHP jest fałsz)Pozostałe odpowiedzi sięgają głęboko i dają świetne wyjaśnienia. Dla tych, którzy szukają szybkiej odpowiedzi,
$a ?: 'fallback'
jest$a ? $a : 'fallback'
podczas
$a ?? 'fallback'
jest$a = isset($a) ? $a : 'fallback'
Główną różnicą byłoby, gdy lewy operator to:
0
,''
,false
,[]
, ...)źródło
$a =
powyższym rozszerzeniu nie powinno być??
.$a ?? 'fallback'
nie ustawia ani nie zmienia wartości $ a. (Zwraca jedynie wartość).Wygląda na to, że istnieją zalety i wady korzystania z jednego
??
lub?:
. Zaletą użycia?:
jest to, że ocenia fałsz, zero i to samo. Con polega na tym, że zgłasza E_NOTICE, jeśli poprzedzający argument jest pusty. Z??
pro jest to, że nie ma E_NOTICE, ale wada polega na tym, że nie ocenia on fałszu i zeruje to samo. Z mojego doświadczenia wynika, że ludzie zaczęli używać zamiennie wartości NULL i FAŁSZ, ale w końcu uciekali się do modyfikacji kodu, aby był zgodny z użyciem wartości NULL lub FAŁSZ, ale nie obu. Alternatywą jest stworzenie bardziej rozbudowanego trójkowego warunku:(isset($something) or !$something) ? $something : $something_else
.Poniżej znajduje się przykład różnicy używania
??
operatora przy użyciu zarówno wartości null, jak i false:Opracowując operator potrójny, możemy jednak zrobić fałszywy lub pusty ciąg „” zachowując się tak, jakby był zerowy bez rzucania e_notice:
Osobiście uważam, że byłoby naprawdę miło, gdyby w przyszłej wersji PHP pojawił się inny nowy operator:
:?
który zastąpiłby powyższą składnię. tj.:// $var = $false :? "true";
Ta składnia ocenia równe null, false i „” w równym stopniu i nie wyrzuca E_NOTICE ...źródło
?? null ?:
sprawa jest niesamowita, dziękuję, panie. mądry facet.źródło
Null Coalescing operator
wykonuje tylko dwa zadania: sprawdzawhether the variable is set
iwhether it is null
. Spójrz na następujący przykład:Powyższy przykład kodu stanowi, że
Null Coalescing operator
traktuje nieistniejącą zmienną i zmienną ustawionąNULL
w ten sam sposób.Null Coalescing operator
jest poprawą w stosunku doternary operator
. Spójrz na następujący fragment kodu porównujący oba:Różnica między nimi polega na tym
Null Coalescing operator
, że operator jest zaprojektowany tak, aby lepiej obsługiwać niezdefiniowane zmienneternary operator
. Tymczasemternary operator
jest to skrótif-else
.Null Coalescing operator
nie ma na celu zastąpieniaternary operator
, ale w niektórych przypadkach użycia, takich jak w powyższym przykładzie, pozwala na pisanie czystego kodu bez większych problemów.Kredyty: http://dwellupper.io/post/6/php7-null-coalescing-operator-usage-and-examples
źródło
isset($_POST['fullname'])
już sprawdzaNULL
wartości - więc&& !is_null($_POST['fullname'])
w pierwszym przykładzie i tak jest zbędnyKorzystając z superglobali, takich jak $ _GET lub $ _REQUEST, należy pamiętać, że mogą to być puste ciągi znaków. W tym szczególnym przypadku ten przykład
zakończy się niepowodzeniem, ponieważ wartość $ username jest teraz pustym ciągiem.
Tak więc, używając $ _GET, a nawet $ _REQUEST, powinieneś użyć operatora trójskładnikowego w następujący sposób:
Teraz wartością $ username jest „nikt”, zgodnie z oczekiwaniami.
źródło