Pri prezeraní PHP dokumentácie ma zaujal príklad na konci sekcie
Complex (curly) syntax,
ktorý vysvetľuje použitie
operátora rozlíšenia rozsahu
(::) v rámci zloženej syntaxe pre reťazce v PHP. Pozrime sa na to:
<?php
// Show all errors.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// This works; outputs: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// This works too; outputs: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
Začal som premýšľať o vyššie uvedenom výňatku kódu, ale bolo to zvláštne, pretože som neočakával, že vo výstupoch uvidím A & W ani Alexander Keith. Na chvíľu som si pomyslel, že dokumentácia môže byť nesprávna, tak som sa rozhodol skript spustiť. Očakával som vidieť:
I'd like an rootbeer
I'd like an ipa
Úprimne povedané, nebol som si úplne istý ohľadom ipa z druhého riadku, ale bol som si celkom istý, že prvý riadok by mal vypísať rootbeer. Na moje prekvapenie môj PHP 8.1 interpret sa zhodoval s komentármi zo skriptu:
I'd like an A & W
I'd like an Alexander Keith's
Úprimne povedané, PHP ma takto nezmiatlo už dlho. Pred spustením skriptu
som si pomyslel: Pekné, našiel som spôsob, ako použiť názov triedy, alebo
dôležitejšie, self:: a static:: na výpis konštánt vo vnútri reťazca.
Bohužiaľ — alebo možno naštastie, keďže som sa naučil niečo nové — skript
mi ukázal, že nerozumiem tomu, čo sa deje.
Dôvod #
V dokumentácii je poznámka nad skriptom, takže pre úplnosť som ju skopíroval. Trvalo mi aspoň tri čítania, kým som to úplne pochopil, tak si dajte čas, ak ste tiež zmätení:
Poznámka: Hodnota prístupná z funkcií, volaní metód, statických premenných triedy a konštánt triedy vo vnútri {$} bude interpretovaná ako názov premennej v rozsahu, v ktorom je reťazec definovaný. Používanie jednoduchých zložených závoriek ({}) nebude fungovať pre prístup k návratovým hodnotám funkcií alebo metód alebo hodnotám konštánt triedy alebo statických premenných triedy.
V prípade, že to pre vás stále nedáva zmysel, krátka odpoveď je bohužiaľ: Nie je to možné. Možno v budúcich vydaniach PHP. Jednoducho musíte použiť operátor zreťazenia reťazcov pri odkazovaní na obsah konštanty triedy. Inými slovami, toto je jediný správny spôsob:
<?php
class beers {
const softdrink = 'rootbeer';
}
echo "I'd like an " . beers::softdrink . "\n";
Na druhej strane, teraz môžete písať naozaj ťažko zrozumiteľný kód spôsobom, akým bol napísaný v príkladnom skripte na začiatku príspevku, a spôsobiť vašim kolegom (alebo svojmu budúcemu ja) pekné bolesti hlavy. Žartujem. Nerobte to. Píšte kód, ktorý je čo najzrozumiteľnejší! Užívajte.
Odkazy #
- https://stackoverflow.com/questions/47999803/trouble-using-php-complex-curly-syntax-with-static-variables
- https://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.complex
- https://www.php.net/manual/en/language.oop5.paamayim-nekudotayim.php
- https://www.php.net/manual/en/language.operators.string.php