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 #