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


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

Re: ::class und constant()

Path csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From Arno Welzel <usenet@arnowelzel.de>
Newsgroups de.comp.lang.php
Subject Re: ::class und constant()
Date Tue, 11 Jan 2022 11:50:40 +0100
Lines 78
Message-ID <j455o0F9s0bU1@mid.individual.net> (permalink)
References <1t61dbfeaei1306d1n3e8%sfroehli@Froehlich.Priv.at>
Mime-Version 1.0
Content-Type text/plain; charset=UTF-8
Content-Transfer-Encoding 8bit
X-Trace individual.net 5QF7YNlvYeVmboKR5XxuzA0X34MSor3bpD6/jfKEOGo+W0Kanb
Cancel-Lock sha1:d73PMJbnCEeFQlvgQN5ig50q2j8=
Content-Language de-DE
In-Reply-To <1t61dbfeaei1306d1n3e8%sfroehli@Froehlich.Priv.at>
Xref csiph.com de.comp.lang.php:4762

Show key headers only | 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