Eigenschaften waren eine der größten Ergänzungen für PHP 5.4. Ich kenne die Syntax und verstehe die Idee hinter Merkmalen wie der Wiederverwendung von horizontalem Code für allgemeine Dinge wie Protokollierung, Sicherheit, Caching usw.
Ich weiß jedoch immer noch nicht, wie ich Merkmale in meinen Projekten nutzen würde.
Gibt es Open Source-Projekte, die bereits Merkmale verwenden? Gibt es gute Artikel / Lesematerial zum Strukturieren von Architekturen mithilfe von Merkmalen?
Antworten:
Meine persönliche Meinung ist, dass es beim Schreiben von sauberem Code tatsächlich nur sehr wenige Anwendungen für Merkmale gibt.
Anstatt Merkmale zu verwenden, um Code in eine Klasse zu hacken, ist es besser, die Abhängigkeiten über den Konstruktor oder über Setter zu übergeben:
Der Hauptgrund, warum ich das besser finde als die Verwendung von Merkmalen, ist, dass Ihr Code viel flexibler ist, indem die harte Kopplung an ein Merkmal entfernt wird. Zum Beispiel könnten Sie jetzt einfach eine andere Logger-Klasse übergeben. Dies macht Ihren Code wiederverwendbar und testbar.
quelle
Ich denke, man müsste sich schon seit einiger Zeit mit Sprachen befassen, die Eigenschaften haben, um die akzeptierten Good / Best Practices zu lernen. Meine aktuelle Meinung zu Trait ist, dass Sie sie nur für Code verwenden sollten, den Sie in anderen Klassen duplizieren müssten, die dieselbe Funktionalität haben.
Beispiel für ein Logger-Merkmal:
Und dann machst du ( Demo )
Ich denke, das Wichtigste bei der Verwendung von Merkmalen ist, dass es sich wirklich nur um Codeteile handelt, die in die Klasse kopiert werden. Dies kann leicht zu Konflikten führen, wenn Sie beispielsweise versuchen, die Sichtbarkeit von Methoden zu ändern, z
Das Obige führt zu einem Fehler ( Demo ). Ebenso werden im Merkmal deklarierte Methoden, die auch bereits in der using-Klasse deklariert sind, nicht in die Klasse kopiert, z
druckt 2 ( Demo ). Dies sind Dinge, die Sie vermeiden möchten, da sie das Auffinden von Fehlern erschweren. Sie sollten auch vermeiden, Dinge in Merkmale zu setzen, die auf Eigenschaften oder Methoden der Klasse wirken, die sie verwendet, z
funktioniert ( Demo ), aber jetzt ist das Merkmal eng mit A verbunden und die gesamte Idee der horizontalen Wiederverwendung geht verloren.
Wenn Sie dem Prinzip der Schnittstellentrennung folgen, haben Sie viele kleine Klassen und Schnittstellen. Das macht Traits zu einem idealen Kandidaten für die Dinge, die Sie erwähnt haben, z. B. Querschnittsthemen , aber keine Objekte (im strukturellen Sinne) zu komponieren. In unserem obigen Logger-Beispiel ist das Merkmal vollständig isoliert. Es gibt keine Abhängigkeiten von konkreten Klassen.
Wir könnten Aggregation / Komposition verwenden (wie an anderer Stelle auf dieser Seite gezeigt), um dieselbe resultierende Klasse zu erzielen, aber der Nachteil der Verwendung von Aggregation / Komposition besteht darin, dass wir die Proxy- / Delegator-Methoden manuell zu jeder Klasse hinzufügen müssen, die dies sollte in der Lage sein zu protokollieren. Eigenschaften lösen dieses Problem gut, indem ich die Kesselplatte an einem Ort aufbewahren und bei Bedarf selektiv anwenden kann.
Hinweis: Da Merkmale in PHP ein neues Konzept sind, können sich alle oben geäußerten Meinungen ändern. Ich hatte noch nicht viel Zeit, das Konzept selbst zu bewerten. Aber ich hoffe, es ist gut genug, um Ihnen etwas zum Nachdenken zu geben.
quelle
:) Ich mag es nicht zu theoretisieren und darüber zu debattieren, was mit etwas gemacht werden soll. In diesem Fall Eigenschaften. Ich werde Ihnen zeigen, wofür ich Eigenschaften nützlich finde, und Sie können entweder daraus lernen oder sie ignorieren.
Eigenschaften - sie sind großartig, um Strategien anzuwenden . Kurz gesagt, Strategiedesignmuster sind nützlich, wenn dieselben Daten unterschiedlich behandelt (gefiltert, sortiert usw.) werden sollen.
Beispielsweise haben Sie eine Liste von Produkten, die Sie nach bestimmten Kriterien (Marken, Spezifikationen, was auch immer) herausfiltern oder nach verschiedenen Mitteln sortieren möchten (Preis, Etikett, was auch immer). Sie können ein Sortiermerkmal erstellen, das verschiedene Funktionen für verschiedene Sortiertypen (numerisch, Zeichenfolge, Datum usw.) enthält. Sie können dieses Merkmal dann nicht nur in Ihrer Produktklasse (wie im Beispiel angegeben) verwenden, sondern auch in anderen Klassen, die ähnliche Strategien benötigen (um eine numerische Sortierung auf einige Daten usw. anzuwenden).
Versuch es:
Abschließend denke ich über Merkmale wie Zubehör nach (mit denen ich meine Daten ändern kann). Ähnliche Methoden und Eigenschaften, die aus meinen Klassen herausgeschnitten und an einem einzigen Ort abgelegt werden können, für eine einfache Wartung, kürzeren und saubereren Code.
quelle
strategies
.Ich freue mich über Traits, da sie ein häufiges Problem bei der Entwicklung von Erweiterungen für die Magento-E-Commerce-Plattform lösen . Das Problem tritt auf, wenn Erweiterungen einer Kernklasse (z. B. dem Benutzermodell) Funktionen hinzufügen, indem sie diese erweitern. Dazu zeigen Sie dem Zend-Autoloader (über eine XML-Konfigurationsdatei), dass er das Benutzermodell aus der Erweiterung verwenden soll, und lassen Sie dieses neue Modell das Kernmodell erweitern. ( Beispiel ) Aber was ist, wenn zwei Erweiterungen dasselbe Modell überschreiben? Sie erhalten eine "Rennbedingung" und nur eine wird geladen.
Die derzeitige Lösung besteht darin, die Erweiterungen so zu bearbeiten, dass eine die Modellüberschreibungsklasse des anderen in einer Kette erweitert, und dann die Erweiterungskonfiguration so festzulegen, dass sie in der richtigen Reihenfolge geladen werden, damit die Vererbungskette funktioniert.
Dieses System verursacht häufig Fehler. Bei der Installation neuer Erweiterungen müssen Sie nach Konflikten suchen und Erweiterungen bearbeiten. Dies ist ein Schmerz und unterbricht den Upgrade-Prozess.
Ich denke, die Verwendung von Traits wäre ein guter Weg, um dasselbe zu erreichen, ohne dass dieses nervige Modell die "Rennbedingung" außer Kraft setzt. Zugegeben, es könnte immer noch Konflikte geben, wenn mehrere Traits Methoden mit demselben Namen implementieren, aber ich würde mir vorstellen, dass eine einfache Namespace-Konvention dies größtenteils lösen könnte.
TL; DR Ich denke, Traits könnten nützlich sein, um Erweiterungen / Module / Plugins für große PHP-Softwarepakete wie Magento zu erstellen.
quelle
Sie könnten eine Eigenschaft für schreibgeschützte Objekte wie diese haben:
Sie können feststellen, ob dieses Merkmal verwendet wird, und bestimmen, ob Sie dieses Objekt in eine Datenbank, Datei usw. schreiben sollen oder nicht.
quelle
use
dieses Merkmal dann nennen würdeif($this -> getReadonly($value))
; Dies würde jedoch einen Fehler erzeugen, wenn Sieuse
dieses Merkmal nicht verwenden würden. Daher ist dieses Beispiel fehlerhaft.