PHP-Attribute wurden in PHP 8.0 eingeführt. Diese Version stellte einen bedeutenden Meilenstein für die Sprache dar und brachte mehrere neue Funktionen und Verbesserungen mit sich, darunter die Einführung von Attributen zum Hinzufügen von Metadaten zu Codedeklarationen.
Das erste Mal, dass ich mich mit Attributen befassen musste, war ein Problem in der PHP-Bibliothek des Inspektors. Schauen Sie auf GitHub nach. Bevor wir tiefer in die Lösung eintauchen, werfen wir einen Überblick darüber, was Attribute sind und wie sie in Ihrem PHP-Code verwendet werden können.
Attribute sind eine leistungsstarke Funktion, mit der Sie Metadaten zu Deklarationen wie Klassen, Methoden oder Eigenschaften hinzufügen können. Diese Metadaten können programmgesteuert abgerufen werden, was neue Möglichkeiten für saubereren, besser organisierten und effizienteren Code eröffnet.
Denken Sie daran, dass Attribute zur Laufzeit keine Auswirkung haben. Sie stehen in den Reflection-APIs zur Verfügung, um Ihre Anwendung auf der Grundlage von Attributen, die einer Klasse, Methode oder Eigenschaft zugeordnet sind, auf Dinge aufmerksam zu machen, die Sie ausführen möchten.
PHP verfügt über mehrere integrierte Attribute, die unterschiedlichen Zwecken dienen. Hier sind einige bemerkenswerte:
Markiert eine Funktion oder Methode als veraltet und signalisiert, dass sie vermieden werden sollte, da sie in zukünftigen Versionen möglicherweise entfernt wird.
#[Deprecated("Use newFunction() instead")] function oldFunction() { // Function implementation }
Stellt sicher, dass die Methode in einer untergeordneten Klasse eine Methode in der übergeordneten Klasse überschreiben soll.
class Child extends Parent { #[Override] public function defaultMethod() { // Method implementation } }
Wenn defaultMethod() irgendwann seinen Namen in der übergeordneten Klasse ändert, ist dies keine Überschreibung mehr. In diesem Fall gibt PHP eine Warnung aus, da wir ausdrücklich erklärt haben, dass wir mit einer Überschreibung rechnen und uns auf die Fehlausrichtung aufmerksam machen.
Wie auch immer, eine gute IDE sollte es uns ermöglichen, solche Fehler nicht zu begehen.
Unterdrückt spezifische Warnungen für einen bestimmten Codeabschnitt.
#[SuppressWarnings("SomeWarning")] function someFunction() { // Function implementation }
Jetzt erstellen wir eine benutzerdefinierte Attributklasse. Dies ist von Vorteil, wenn Sie bestimmtes Verhalten innerhalb eines Attributs kapseln möchten.
#[Attribute] class CustomAttribute { public string $message; public function __construct(string $message) { $this->message = $message; } }
Sie können dieses benutzerdefinierte Attribut dann für verschiedene Elemente verwenden:
class MyClass { #[CustomAttribute("This is a custom attribute")] public $myProperty; #[CustomAttribute("Another custom attribute")] public function myMethod() { // Method implementation } }
Lassen Sie uns ein praktisches Beispiel untersuchen. Angenommen, Sie erstellen eine Webanwendung und möchten ein benutzerdefiniertes Attribut erstellen, um die Länge einer Zeichenfolge zu definieren:
#[Attribute(Attribute::TARGET_PROPERTY)] class MaxLength { public int $maxLength; public function __construct(int $maxLength) { $this->maxLength = $maxLength; } }
Im obigen Beispiel haben wir die Möglichkeit eingeschränkt, das Attribut nur auf Klasseneigenschaften anzuwenden. Jetzt können wir es in der User-Klasse verwenden:
class User { #[MaxLength(20, message: "Username must be 20 characters or less")] public string $username; // Other properties and methods }
Wie bereits erwähnt, hat das Hinzufügen des Attributs zur Eigenschaft keine Auswirkungen auf die Ausführung. Aber wir können diese Informationen jetzt durch Reflektion abrufen, um schließlich Maßnahmen zu ergreifen.
Die am häufigsten verwendeten PHP-Frameworks wie Symfony und Laravel übernehmen bereits Attribute, um „Annotationen“ grundsätzlich zu ersetzen. In Symfony 5.2 oder höher können Sie einen Controller deklarieren und ihn mithilfe von Attributen mit einer Route verbinden:
public class Arrayable implements \ArrayAccess { … public function offsetExists($offset) { return isset($this->data[$offset]); } … }
Seit PHP 8 hat sich die Definition der ArrayAccess-Schnittstelle geändert in:
Mit der Verwendung von Attributen erzwangen sie die Deklaration des Datentyps für die Argumente in Offset-Funktionen. Wenn die Implementierung mithilfe des LanguageLevelTypeAware-Attributs den Datentyp für Argumente nicht bereitstellt, wird eine „Veraltungswarnung“ ausgelöst.
Aber die Deklaration des Datentyps in Funktionsargumenten beeinträchtigt die Kompatibilität mit älteren PHP-Versionen, die die Datentypdeklaration von Argumenten nicht unterstützen.
Da es sich nur um eine Warnung für zukünftige Änderungen handelte, haben wir das Problem mit einem anderen integrierten PHP-Attribut gelöst, um die Warnung zu unterdrücken:
public class Arrayable implements \ArrayAccess { … #[\ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->data[$offset]); } … }
Das ReturnTypeWillChange-Attribut teilt PHP einfach mit, dass wir über die zukünftigen Änderungen in der Sprache Bescheid wissen und die notwendigen Aktualisierungen bereits geplant haben.
Besonders für diese Änderung werden sie definitiv in PHP 9 implementiert.
Denken Sie daran, Attribute mit Bedacht zu verwenden und Ihre Codebasis sauber und gut dokumentiert zu halten. Dies ist besonders wichtig bei der Entwicklung von SaaS-Produkten, wo Skalierbarkeit, Wartbarkeit und Effizienz im Vordergrund stehen.
Inspector ist ein Tool zur Codeausführungsüberwachung, das speziell für Softwareentwickler entwickelt wurde. Sie müssen nichts auf Serverebene installieren, installieren Sie einfach das Composer-Paket und schon kann es losgehen.
Im Gegensatz zu anderen komplexen All-in-One-Plattformen ist Inspector supereinfach und PHP-freundlich. Sie können unser Laravel- oder Symfony-Paket ausprobieren.
Wenn Sie auf der Suche nach effektiver Automatisierung, umfassenden Einblicken und der Möglichkeit sind, Warnungen und Benachrichtigungen an Ihre Messaging-Umgebung weiterzuleiten, testen Sie Inspector kostenlos. Registrieren Sie Ihr Konto.
Oder erfahren Sie mehr auf der Website: https://inspector.dev
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3