Stefan Froehlich:
> Das folgende Codefragment:
>
> #v+
> <?php
>
> class C {
> const c = 'c';
> }
>
> var_dump(constant('C::class'));
>
> ?>
> #v-
>
> ergibt bis einschließlich PHP 7.4 "NULL", ab PHP 8.0 offenbar (das
> habe ich nur mit
3v4l.org getestet) einen fatal error.
>
> Ist das ein Bug, ein Feature, oder halt einfach so passiert? Wieso
> darf ::class, das im Manual als "special constant" bezeichnet wird,
> nicht wie eine Konstante verwendet werden?
Nein, es ist ein Missverständnis deinerseits.
Mit dieser Anweisung wird versucht, den Inhalt einer Konstanten zu
ermittelt, die den Name "ABC" hat:
$valueOfABC = constant('ABC');
In der Praxis ist das exakt gleichbedeutend mit
$valueOfABC = ABC;
Nun gibt es einige "magische" Konstanten, die man nicht selber
definiert, sondern die PHP schon kennt:
<
https://www.php.net/manual/en/language.constants.magic.php>
Dazu gehört dann u.A. eben auch <Klassename>::class, was aufgelöst wird
zu einem String, der den Namen einer Klasse repräsentiert.
Beispiel:
$className = C::class;
ist dann gleichbedeutend mit:
$className = 'C';
Da PHP zur Laufzeit aus C::class eben 'C' macht.
Oder wenn Du den die aktuelle Zeile im Code haben willst:
$currentLineOfCode = __LINE__;
Wenn diese Anweisung in Zeile 5 steht, würde zur Laufzeit umgewandelt in:
$currentLineOfCode = 5;
Was aber *nicht* geht, ist Konstanten als Teil eines String zu verwenden.
$currentLineOfCode = '__LINE__';
Das liefert eben nur den Text "__LINE__" und nicht den Wert 5, weil es
sich bei dem Ausdruck '__LINE__' um einen String handelt.
Wenn Du sowas machst:
var_dump(constant('C::class'));
Dann sucht PHP nach der Konstante mit den *exakten* Namen 'C::class' -
und die gibt es eben nicht.
--
Arno Welzel
https://arnowelzel.de