Od jaké verze funguje operátor in a řetězení s undefined-safe operátorem?

Kcko
Člen | 465
+
0
-

Ahoj,
přečetl jsem si po nějaké době vstupní stránku o Latte se syntaktickým cukrem a chtěl jsem si vyzkoušet

řetězení s undefined-safe operátorem
https://blog.nette.org/…epsi-nakonec

<?php
{var $x = new \DateTime()}
{$x??->prop??->elem[1]??->call()}
?>

Nespadne, fajn.

<?php
{var $x = new \DateTime()}
{$x??->prop}
?>

Spadne na Undefined property: DateTime::$prop, proč?

A od jaké verze funguje operátor in? Nikde nevidím a možná to v dokumentaci bylo dříve (nebo v jiných sekcích) od jaké verze daného balíčku daná funkcionalita fungovala.

Mám Latte 2.10.9

Díky za info.

Editoval Kcko (27. 7. 2023 11:14)

Marek Bartoš
Nette Blogger | 1175
+
0
-

Undefined-safe a null-safe operátory jsou určené pro volání na neexistujících/null hodnotách. Ne pro volání neexistujících hodnot.

var_dump((null)?->foo()); // vypíše null

Pro neexistující hodnoty se dá použít isset(). Nerozlišuje ale mezi undefined/unintialized/null

$dt = new DateTime;
var_dump(isset($dt->prop)); // vypíše false

Nebo ReflectionProperty (pro undefined vyhodí výjimku při vytvoření, uninitialized se rozliší přes ReflectionProperty->isInitialized())

Editoval Marek Bartoš (27. 7. 2023 12:45)

Kcko
Člen | 465
+
0
-

Marek Bartoš napsal(a):

Undefined-safe a null-safe operátory jsou určené pro volání na neexistujících/null hodnotách. Ne pro volání neexistujících hodnot.

var_dump((null)?->foo()); // vypíše null

Pro neexistující hodnoty se dá použít isset(). Nerozlišuje ale mezi undefined/unintialized/null

$dt = new DateTime;
var_dump(isset($dt->prop)); // vypíše false

Nebo ReflectionProperty (pro undefined vyhodí výjimku při vytvoření, uninitialized se rozliší přes ReflectionProperty->isInitialized())

Bavíme se o tomhle? https://latte.nette.org/cs/syntax#…

Mělo by to fungovat stejně jako v JS ne?

Marek Bartoš
Nette Blogger | 1175
+
0
-

Ano. Dokonce je to na té stránce vysvětlené.

Kcko
Člen | 465
+
0
-

Marek Bartoš napsal(a):

Ano. Dokonce je to na té stránce vysvětlené.

Pardon, moje chyba, v JS to funguje úplně stejně, nevím co me to napadlo to zkoušet takhle pitomě (možná to že jsem v noci nespal a už se projevuje deficit).

Díky; chápu.