Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.php > #4762

Re: ::class und constant()

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>

Show all headers | View raw


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 | NextPrevious in thread | Next in thread | Find similar


Thread

::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