Für weniger Geschrei im Code
Der Nette-Kodierungsstil erfährt eine kleine Änderung: die PascalCase-Notation wird nun für Klassenkonstanten anstelle des ursprünglichen SCREAMING_SNAKE_CASE verwendet.
Die Tradition, Konstanten in Großbuchstaben zu schreiben, stammt aus der Sprache C, wo sogenannte Präprozessor-Makro-Konstanten als solche bezeichnet wurden. Es war sinnvoll, die Unterscheidung zwischen Parser-Code und Präprozessor-Code nicht zu übersehen. PHP braucht diese Unterscheidung nicht, da es keinen Präprozessor hat. Andererseits ist eine Überbetonung der Konstanten kontraproduktiv. Warum sollte eine Konstante schreien und die Aufmerksamkeit auf sich ziehen, ein herausragendes Element im Programmablauf sein? Es gibt keinen Grund dafür.
Beispiel für echten Code mit SCREAMING_SNAKE_CASE-Konstanten, die im Code aggressiv hervorstechen und außerdem schwerer zu lesen sind:
foreach (self::SYMBOL_TO_NAME as $symbol => $name) {
$idx = self::ACTION_BASE[$state] + $symbol;
if (($idx >= 0 && $idx < count(self::ACTION) && self::ACTION_CHECK[$idx] === $symbol
|| $state < self::YY_2_TBLSTATE
&& ($idx = self::ACTION_BASE[$state + self::NUM_NON_LEAF_STATES] + $symbol) >= 0
&& $idx < count(self::ACTION) && self::ACTION_CHECK[$idx] === $symbol)
&& self::ACTION[$idx] !== self::UNEXPECTED_TOKEN_RULE
&& self::ACTION[$idx] !== self::DEFAULT_ACTION
&& $symbol === 0
) {
return true;
}
}
Ein Beispiel desselben Codes mit PascalCase-Konstanten, der viel kompakter aussieht:
foreach (self::SymbolToName as $symbol => $name) {
$idx = self::ActionBase[$state] + $symbol;
if (($idx >= 0 && $idx < count(self::Action) && self::ActionCheck[$idx] === $symbol
|| $state < self::Yy2Tblstate
&& ($idx = self::ActionBase[$state + self::NumNonLeafStates] + $symbol) >= 0
&& $idx < count(self::Action) && self::ActionCheck[$idx] === $symbol)
&& self::Action[$idx] !== self::UnexpectedTokenRule
&& self::Action[$idx] !== self::DefaultAction
&& $symbol === 0
) {
return true;
}
}
Kompatibilität
Nette ist natürlich auf Rückwärtskompatibilität bedacht. Alle
öffentlichen Konstanten bleiben auch in ihrer ursprünglichen Form erhalten und
dienen als Aliase für die bevorzugten PascalCase-Konstanten. Sie werden auch in
der nächsten Hauptversion weiterbestehen und das @deprecated
Flag haben.
Alle neu hinzugefügten Klassenkonstanten gibt es nur noch in der PascalCase-Variante. Globale Konstanten werden von Nette nicht verwendet.
Aufzählungen
PHP 8.1 kommt mit Aufzählungen, die auch in Nette verwendet werden. Enums werden die bisherige Lösung mit Konstanten ersetzen. Es gibt noch keinen Standard für die Programmierung von Aufzählungen, die PHP-FIG-Organisation hat in dieser Hinsicht lange versagt und kommt mit ihren Empfehlungen viele Jahre zu spät. Die PHP-Dokumentation selbst ist ein Leitfaden. Sie verwendet für “enum cases” ausschließlich die PascalCase-Notation, und das gilt auch für die frühere experimentelle Implementierung SplEnum.
Die Kombination von PascalCase-Aufzählungen mit SCREAMING_SNAKE_CASE-Konstanten würde inkonsistent aussehen, so dass dies auch ein Grund ist, den Schreibstil für Konstanten zu ändern.
*Technische Anmerkung: Aufzählungen sind syntaktischer Zucker für Konstanten, aus PHP-Sicht gibt es keinen Unterschied zwischen “enum case” und Klassenkonstanten.
Wie kann man den eigenen Code ändern?
Jede kosmetische Änderung wird immer eine Menge Unmut hervorrufen. Aber wenn
Sie die PascalCase-Konstanten einen Monat lang ausprobieren, werden Sie
begeistert sein und es gibt kein Zurück mehr. Und Sie werden die neue Notation
auch in Ihrem eigenen Code einführen wollen. Wie man das macht? Am besten
benennen Sie die Konstanten in PhpStorm mit der Funktion
Refactor > Rename
um. Installieren Sie außerdem das Plugin String
Manipulation und weisen Sie ihm einen Shortcut in den Einstellungen für
Switch Case > To Pascal Case
zu.
Dann müssen Sie nur noch den Cursor auf die Konstante setzen,
Ctrl-F6
(Umbenennen) und dann die Verknüpfung für
To Pascal Case
drücken und PhpStorm ändert die Konstante im
gesamten Projekt.
Viel Spaß beim Kodieren!
Um einen Kommentar abzugeben, loggen Sie sich bitte ein