Na operátor ??
se v PHP čekalo neskutečně dlouho, snad
deset let. Dnes je mi ale líto, že se nečekalo déle.
- Počkej, cože? Deset let? Tak to přeháníš, ne?
- Opravdu. Začal se řešit v roce 2004, pod názvem „ifsetor“. A dostal se do PHP až v prosinci 2015 ve verzi 7.0. Takže téměř 12 let.
- Aha! Notyvole.
Škoda, že se nečekalo déle. Do současného PHP totiž nezapadá.
PHP počínaje verzí 7.0 udělalo neuvěřitelný posun ke striktnosti. Klíčové okamžiky:
- zavedení skalárních typů (které prošly jen tak tak)
- nulovost (od 7.1,
null
se stal důležitým a nahrazuje dřívějšíreturn false
) - příčetné porovnávání (od 8.0, nechápu, že to Nikicovi tak snadno prošlo, JavaScript musí závidět)
- zrušení dynamických properites (definitivní konec „Vránovského“ PHP)
Operátor ??
zjednodušil otravné:
isset($necoCo[$musimNapsatDvakrat]) ? $necoCo[$musimNapsatDvakrat] : 'default value'
na pouhé:
$pisu[$jednou] ?? 'default value'
Jenže udělal to v době, kdy potřeba používat isset()
značně klesla. Dnes častěji počítáme s tím, že data, ke kterým
přistupujeme, existují. A pokud neexistují, tak se o tom sakra chceme
dozvědět.
Operátor ??
má ale vedlejší efekt a to schopnost detekovat
null. Což je taky nejčastější důvod k jeho užití:
$len = $this->length ?? 'default value'
Bohužel zároveň zatajuje chyby. Zatajuje překlepy:
// vždy vrátí 'default value', víte proč?
$len = $this->lenght ?? 'default value'
Zkrátka ??
jsme dostali přesně ve chvíli, kdy bychom naopak
nejvíc potřeboval zkrátit tohle:
$necoCo[$musimNapsatDvakrat] === null
? 'default value'
: $necoCo[$musimNapsatDvakrat]
Bylo by úžasné, kdyby PHP 9.0 mělo odvahu chování operátoru
??
upravit k trošku větší striktnosti. Udělat z „isset
operátoru“ opravdu „null coalesce operator“, jak se mimochodem oficiálně jmenuje.
S detekcí překlepů zamlčených operátorem ??
vám
pomůže PHPStan s nastavením checkDynamicProperties:
true.
Komentáře
Jakub Vrána #1
„Vránovským“ PHP narážíš na tohle? https://php.vrana.cz/…vku-pole.php
David Grudl #2
#1 Jakub Vrána, myslel jsem spíš legendární hlášku „skripty předpokládají vypnuté E_NOTICE“ :)
Tomáš #3
Myslím, že není nutno čekat na PHP 9.0, operátor
??=
umí PHP už od 7.4…A nebo jsem nepochopil článek a bavíme se o něčem úplně jiném :D
ukázka
Napište komentář