Robert Landers hat das nameof()-RFC auf der PHP-Internals-Liste zur Diskussion gestellt. Der Vorschlag führt ein Compiler-Konstrukt ein, das wie eine Funktion aussieht, sich aber wie ::class verhält: Es wird zur Kompilierzeit zu einem String aufgelöst und kann überall verwendet werden, wo ein String-Literal erlaubt ist, auch in Konstantendefinitionen, Array-Schlüsseln und Attribut-Argumenten.
Das Konstrukt deckt Variablen, Properties, Methoden, Funktionen und Konstanten ab. So würde nameof($this->myProperty) zu "myProperty" ausgewertet, nameof($a->exampleB(...)) zu "exampleB", wobei für Funktionen und Methoden die First-Class-Callable-Syntax genutzt wird.
Ein zentraler Streitpunkt ist die Namensauflösung. Im aktuellen Entwurf liefern Konstanten und Funktionen den lexikalischen Namen statt des vollqualifizierten: Wird eine Funktion mit use function Acme\bar as foo importiert, ergibt nameof(foo(...)) den String "foo". Wer den vollqualifizierten Namen haben will, schreibt ihn vollständig in nameof(). Landers begründet das mit Trait-Aliassen und Fehlermeldungen, in denen der lokale Name oft nützlicher ist. Rowan Tommins argumentiert umgekehrt: Der Hauptvorteil gegenüber reinen Strings wäre die Namespace-Auflösung wie bei ::class, vor allem wenn der String an Code in einer anderen Datei weitergereicht wird, etwa an einen Attribut-Konstruktor.
Die Fehlerbehandlung ist noch offen. Landers skizzierte zwei Optionen: gar keine Prüfung, also reine String-Manipulation wie bei ::class, oder eine Warnung bei nicht existierenden Namen, die sich mit @ unterdrücken ließe. Tommins warf die Frage auf, wann die Auflösung erfolgen soll, da Compile-Zeit-Prüfungen Symbole in anderen Dateien nicht sehen können und Laufzeit-Prüfungen Autoloading-Fragen aufwerfen. Landers erklärte, er habe das RFC nach Feedback von Dan Ackroyd um Details ergänzt.
Lydia de Jongh schlug eine Syntax im Stil magischer Konstanten vor, etwa MyClass::$property::name, mit dem Argument, das funktioniere besser in Attributen und Editoren. Tommins merkte an, dass ::class keine echte Konstante und nameof() keine echte Funktion sei; beides seien Compiler-Syntaxen, die Strings erzeugen, sodass die funktionsähnliche Form ebenfalls in Attributen funktioniert. Landers wies zudem darauf hin, dass eine ::name-Konstante mit bestehenden Benutzer-Konstanten namens "name" kollidieren könnte.
Dan Ackroyd kritisierte den Plan, Designfragen per Sekundärabstimmung zu klären. Der RFC-Prozess zwinge Autoren dazu, Details selbst durchzudenken, so Ackroyd; wer Optionen zur Abstimmung stelle, überlasse diese Arbeit den Wählern. Landers sagte zu, konkrete Anwendungsbeispiele und Details zu Fehlerbedingungen ins RFC aufzunehmen. Die Diskussion läuft noch, ein Abstimmungstermin steht nicht fest.




Kommentare
Noch keine Kommentare — schreib den ersten.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Nichts angekommen? Wirf einen Blick in den Spam-Ordner — und markiere die Mail dort als „Kein Spam“, dann landet sie künftig direkt im Postfach.