Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #4762
| From | Arno Welzel <usenet@arnowelzel.de> |
|---|---|
| Newsgroups | de.comp.lang.php |
| Subject | Re: ::class und constant() |
| Date | 2022-01-11 11:50 +0100 |
| Message-ID | <j455o0F9s0bU1@mid.individual.net> (permalink) |
| References | <1t61dbfeaei1306d1n3e8%sfroehli@Froehlich.Priv.at> |
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
Back to de.comp.lang.php | Previous | Next — Previous in thread | Next in thread | Find similar
::class und constant() Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2022-01-10 09:46 +0000
Re: ::class und constant() k@rl.pflaesterer.de (Karl Pflästerer) - 2022-01-10 22:29 +0100
Re: ::class und constant() Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2022-01-10 23:12 +0000
Re: ::class und constant() Arno Welzel <usenet@arnowelzel.de> - 2022-01-11 11:50 +0100
Re: ::class und constant() Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2022-01-11 13:41 +0000
Re: ::class und constant() k@rl.pflaesterer.de (Karl Pflästerer) - 2022-01-11 16:40 +0100
Re: ::class und constant() Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2022-01-11 17:36 +0000
csiph-web