Handbuch zur Verwendung von Merkmalen in PHP 5.4
Kernpunkte
insteadof
, um Konflikte zwischen Merkmalen mit demselben Methodennamen zu lösen, oder um mithilfe des Schlüsselworts as
Methoden zu erstellen. Ein wichtiges Ziel der objektorientierten Programmierung ist die Minimierung der Code-Duplikation durch bessere Organisation und Code-Wiederverwendung. In PHP kann dies jedoch aufgrund der Einschränkungen des einzelnen Vererbungsmodells, das es verwendet, manchmal schwierig sein. Sprachen wie C und Python ermöglichen es uns, aus mehreren Klassen zu erben, was dieses Problem in gewissem Maße löst, während Mixin in Ruby es uns ermöglicht, die Funktionalität eines oder mehrerer Klassen ohne Erbschaft zu mischen. Multiple Vererbung hat jedoch Probleme wie Diamantprobleme, und Mixin ist auch ein komplexer Mechanismus. In diesem Artikel werde ich Merkmale diskutieren, eine neue Funktion, die in PHP 5.4 eingeführt wird, um solche Probleme zu überwinden. Das Konzept der Merkmale selbst ist in der Programmierung nicht neu und wird in anderen Sprachen wie Scala und Perl verwendet. Sie ermöglichen es uns, Code zwischen unabhängigen Klassen mit verschiedenen Klassen horizontal wiederzuverwenden, die Hierarchien erben.
Merkmals Erscheinungsbild
Das-Merkmal ähnelt einer abstrakten Klasse, die nicht separat instanziiert werden kann (obwohl es häufiger im Vergleich zu einer Schnittstelle verglichen wird). Das PHP -Dokument definiert Merkmale wie folgt: & GT; Der Zweck von Merkmalen ist es, einige der Einschränkungen der einzelnen Vererbung zu verringern, indem Entwickler die Methodensätze in mehreren unabhängigen Klassen frei wiederverwenden können (existieren in verschiedenen Klassenbildern).
Betrachten wir dieses Beispiel:
<?php class DbReader extends Mysqli { } class FileReader extends SplFileObject { }
Es wäre ein Problem, wenn beide Klassen eine gemeinsame Funktionalität erfordern, z. B. sie beide Singletons zu machen. Da PHP keine Mehrfachvererbung unterstützt, muss jede Klasse den erforderlichen Code implementieren, der das Singleton -Muster unterstützt, oder es wird eine bedeutungslose Erbschaftshierarchie geben. Merkmale bieten eine Lösung für diese Art von Problem.
<?php trait Singleton { private static $instance; public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self; } return self::$instance; } } class DbReader extends ArrayObject { use Singleton; } class FileReader { use Singleton; }
Singleton -Merkmal wird in einer direkten Implementierung von Singleton -Muster mit einer statischen Methode getInstance()
implementiert, die dieses Merkmal verwendet, um ein Objekt der Klasse zu erstellen (wenn auch nicht bereits erstellt) und zurücksend. Versuchen wir, Objekte dieser Klassen mithilfe der getInstance()
-Methode zu erstellen.
<?php class DbReader extends Mysqli { } class FileReader extends SplFileObject { }
Wir können sehen, dass $a
ein Objekt von DbReader
und $b
ein Objekt von FileReader
ist, aber beide erscheinen jetzt als Singletons. Die Methode von Singleton wurde horizontal in die Klasse injiziert, die sie verwendet. Merkmale verleihen der Klasse keine zusätzliche Semantik. Bis zu einem gewissen Grad können Sie sich als Compiler-unterstützten Kopiermechanismus vorstellen, bei dem die Methoden von Merkmalen in eine zusammengesetzte Klasse kopiert werden. Wenn wir nur $instance
aus der übergeordneten Klasse mit einem privaten DbReader
-attribut unterklassen, wird das Attribut nicht in der Dump von ReflectionClass::export()
angezeigt. Mit Merkmalen ist es jedoch da!
<?php trait Singleton { private static $instance; public static function getInstance() { if (!(self::$instance instanceof self)) { self::$instance = new self; } return self::$instance; } } class DbReader extends ArrayObject { use Singleton; } class FileReader { use Singleton; }
Mehrere Merkmale
Bisher haben wir in einer Klasse nur ein Merkmal verwendet, aber in einigen Fällen müssen wir möglicherweise die Funktionalität mehrerer Merkmale zusammenführen.
<?php $a = DbReader::getInstance(); $b = FileReader::getInstance(); var_dump($a); //object(DbReader) var_dump($b); //object(FileReader)
Hier haben wir zwei Merkmale, Hello
und World
. Hello
Merkmal kann nur "Hallo" sagen, World
kann nur "Welt" sagen. In der MyWorld
-Klasse haben wir Hello
und World
so angewendet, dass das MyWorld
-Objekt Methoden aus diesen beiden Merkmalen hat und "Hallo Welt" sagen kann.
Merkmale aus Merkmalen
Wenn die Anwendung wächst, werden wir wahrscheinlich eine Reihe von Merkmalen in verschiedenen Klassen verwenden. PHP 5.4 ermöglicht es uns, Merkmale aus anderen Merkmalen zu bestehen, damit wir nur mehrere Merkmale in einen Merkmal einbeziehen müssen, anstatt mehrere Merkmale in all diesen Klassen. Auf diese Weise können wir das vorherige Beispiel wie folgt umschreiben:
<code>Class [ class FileReader ] { @@ /home/shameer/workplace/php54/index.php 19-22 - Constants [0] { } - Static properties [1] { Property [ private static $_instance ] } - Static methods [1] { Method [ static public method instance ] { @@ /home/shameer/workplace/php54/index.php 6 - 11 } } - Properties [0] { } - Methods [0] { } }</code>
Hier haben wir das HelloWorld
-Merkmal erstellt, die Hello
und World
-Merkmale verwendet und es in die MyWorld
aufgenommen. Da HelloWorld
Merkmal Methoden aus den beiden anderen Merkmalen hat, ist es genau das gleiche, als ob wir diese beiden Merkmale selbst in die Klasse aufgenommen haben.
(Der folgende Inhalt wird aufgrund von Platzbeschränkungen und beibehaltenen Kerninformationen kurz zusammengefasst)
Prioritätsreihenfolge: Die Merkmalsmethode hat eine höhere Priorität als die übergeordnete Klassenmethode, und die Klassenmethode hat eine höhere Priorität als die Merkmalsmethode.
Konfliktlösung und Alias: Verwenden Sie insteadof
, um auszuwählen, welche Merkmalsmethode verwendet werden soll, und verwenden Sie as
, um einen Methode -Alias zu erstellen, um Konflikte zu vermeiden.
Reflexion: ReflectionClass
getTraits()
bietet Methoden zur Erhöhung von Merkmalsinformationen in einer Klasse, wie getTraitNames()
, isTrait()
, getTraitAliases()
und
Andere Merkmale:
Merkmale können auf private Eigenschaften und Methoden einer kombinierten Klasse zugreifen, und umgekehrt können Merkmale abstrakte Methoden enthalten, wodurch die kombinierte Klasse diese Methoden implementiert werden kann.Zusammenfassung:
Merkmale sind eine der leistungsstärksten Funktionen, die in PHP 5.4 eingeführt wurden, und in diesem Artikel werden fast alle Funktionen erörtert. Sie ermöglichen Programmierern, Code -Snippets horizontal zwischen mehreren Klassen wiederzuverwenden, die nicht in derselben Erbschaftshierarchie enthalten sind. Sie bieten eher einen leichten Code -Wiederverwendungsmechanismus als einen komplexen Semantik. Obwohl es einige Nachteile von Merkmalen gibt, können sie sicherlich dazu beitragen, das Design Ihrer Anwendung zu verbessern, die Code -Duplikation zu beseitigen und sie trockener zu gestalten.
(Der FAQS -Teil wird hier aufgrund der Länge des Artikels weggelassen. Kerninformationen wurden im obigen Inhalt behandelt.)
Das obige ist der detaillierte Inhalt vonVerwenden von Merkmalen in PHP 5.4. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!