Heim > Backend-Entwicklung > PHP-Tutorial > Verwenden von Merkmalen in Lektionsunternehmen

Verwenden von Merkmalen in Lektionsunternehmen

Jennifer Aniston
Freigeben: 2025-02-19 09:20:11
Original
583 Leute haben es durchsucht

Verwenden von Merkmalen in Lektionsunternehmen

Key Takeaways

  • Merkmale, die seit PHP 5.4.0 verfügbar sind, bieten eine Möglichkeit, den Code wiederzuverwenden, indem eine Reihe von Methoden in eine andere Klasse aufgenommen werden, wodurch die Wiederholung der Code reduziert wird. Sie können in Verbindung mit der Lehre in einer Symfony -Umgebung verwendet werden.
  • Merkmale sollten nicht mit Schnittstellen verwechselt werden. Während eine Schnittstelle ein Vertrag ist, der angibt, was ein Objekt tun kann, gibt ein Merkmal dem Objekt die Fähigkeit, dies zu tun.
  • Merkmale können besonders nützlich sein, um die Datenbankarchitektur zu organisieren und Code -Duplikation zu vermeiden. Zum Beispiel können diese gemeinsamen Eigenschaften beim Erstellen von Artikeln und Kommentaren, die sowohl "erstellte" und "updated_at" -Felder erfordern, in ein Merkmal aufgenommen werden, um Wiederholungen zu vermeiden.
  • Während Merkmale ein hervorragendes Werkzeug für die Erzeugung leichterer und flexiblerer Code sind, sollten sie nicht überbeansprucht werden. Manchmal ist es möglicherweise besser, eine einzigartige Klassenimplementierung zu konstruieren. Es ist entscheidend, genügend Zeit zu nehmen, um Ihre Anwendung ordnungsgemäß zu entwerfen.

Da PHP 5.4.0, unterstützt PHP eine hübsche Möglichkeit, den Code mit dem Namen "Merkmale" wiederzuverwenden - eine Reihe von Methoden, die Sie in eine andere Klasse aufnehmen können, damit Sie sich nicht wiederholen können. Sie können mehr über Merkmale in zuvor veröffentlichten SitePoint -Posts lesen: hier und hier.

Verwenden von Merkmalen in Lektionsunternehmen

Heute werde ich Ihnen zeigen, wie sie mit Lehre in einer Symfony -Umgebung verwendet werden können.

Merkmals Grundlagen

<span><span><?php
</span></span><span><span>trait ExampleTrait {
</span></span><span>    <span>public function sayHello() {
</span></span><span>        <span>echo "Hello";
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>class A {
</span></span><span>    <span>use ExampleTrait;
</span></span><span><span>}
</span></span><span>
</span><span><span>class B {
</span></span><span>    <span>use ExampleTrait;
</span></span><span><span>}
</span></span><span>
</span><span><span>$one = new A();
</span></span><span><span>$one->sayHello();    /* return `Hello` */
</span></span><span>
</span><span><span>$two = new B();
</span></span><span><span>$two->sayHello();    /* return `Hello`, too */</span></span>
Nach dem Login kopieren
Nach dem Login kopieren

Wie wir sehen, wird eine grundlegende Methode Sayhello () in einem Merkmal deklariert, das sowohl von A- als auch von B -Klassen mit einer Anwendungsanweisung implementiert wird. Einfach, richtig? Dieses Beispiel ist wirklich kurz, aber es sollte Ihnen das Grundwissen vermitteln, mit Merkmalen zu arbeiten.

Wenn Sie an Merkmalen interessiert sind, empfehle ich Ihnen, die offizielle Dokumentation und zuvor veröffentlichte SitePoint -Beiträge hier, hier und hier zu lesen, um das Konzept vollständig zu erfassen.
Erlauben Sie mir, Sie vor der Tatsache zu warnen, dass viele Menschen keinen Unterschied zwischen Merkmalen und Schnittstellen sehen. Hier ist eine pragmatische Erklärung:

Eine Schnittstelle ist ein Vertrag mit der Aufschrift „Dieses Objekt kann dieses Ding tun“, während ein Merkmal dem Objekt die Fähigkeit gibt, das Ding zu tun.

Für eine ausführlichere Erklärung können Sie sich diesen aufschlussreichen Beitrag von Philip Brown ansehen, aus dem das vorherige Zitat stammt.

Wenn es darum geht, die Datenbankarchitektur zu organisieren, ist es nicht ungewöhnlich, dass sie Code -Duplikation gegenübersteht. Angenommen, wir müssen die übliche Blog -Anwendung entwickeln. Irgendwann ist es wahrscheinlich, dass wir eine grundlegende Artikeleinheit und wahrscheinlich auch eine Kommentareinheit erstellen.

Beide Entitäten würden von den Feldern erstellt und aktualisiert und updated_at erstellt (damit wir später die Ergebnisse in diesen Spalten sortieren können). Bevor wir uns jedoch mit Merkmalen befassen, lassen Sie uns sehen, wie wir diese Einheiten ohne sie in der Doktrin bauen können.

Schritt 1: Erstellen Sie die Entitäten

Artikelentität

<span><span><?php
</span></span><span><span>trait ExampleTrait {
</span></span><span>    <span>public function sayHello() {
</span></span><span>        <span>echo "Hello";
</span></span><span>    <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>class A {
</span></span><span>    <span>use ExampleTrait;
</span></span><span><span>}
</span></span><span>
</span><span><span>class B {
</span></span><span>    <span>use ExampleTrait;
</span></span><span><span>}
</span></span><span>
</span><span><span>$one = new A();
</span></span><span><span>$one->sayHello();    /* return `Hello` */
</span></span><span>
</span><span><span>$two = new B();
</span></span><span><span>$two->sayHello();    /* return `Hello`, too */</span></span>
Nach dem Login kopieren
Nach dem Login kopieren

Kommentar Entity

<span><span><?php
</span></span><span><span>namespace Blog<span>\AppBundle\Entity</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * @ORM\Table(name="article")
</span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\ArticleRepository")
</span></span><span><span> */
</span></span><span><span>class Article
</span></span><span><span>{
</span></span><span>    <span>/**
</span></span><span><span>     * @ORM\Column(name="idArticle" type="integer")
</span></span><span><span>     * @ORM\Id()
</span></span><span><span>     * @ORM\GeneratedValue(strategy="AUTO")
</span></span><span><span>     */
</span></span><span>    <span>private $id;
</span></span><span>
</span><span>    <span>/* Other properties you need in your entity: $title, $content, $author...  */
</span></span><span>
</span><span>    <span>/** @ORM\Column(name="created_at" type="datetime") */
</span></span><span>    <span>private $createdAt;
</span></span><span>
</span><span>    <span>/** @ORM\Column(name="updated_at" type="datetime") */
</span></span><span>    <span>private $updatedAt;
</span></span><span>
</span><span>   <span>/* Getters & Setters */
</span></span><span><span>}</span></span>
Nach dem Login kopieren

Die gleichen Eigenschaften $ createdat und $ updatedat sind in beiden Klassen enthalten. Das ist alles andere als trocken. Würden Merkmale uns helfen, diesen Code zu reinigen?

Schritt 2: Erstellen Sie das Merkmal

<span><span><?php
</span></span><span><span>namespace Blog<span>\AppBundle\Entity</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * @ORM\Table(name="comment")
</span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\CommentRepository")
</span></span><span><span> */
</span></span><span><span>class Comment
</span></span><span><span>{
</span></span><span>    <span>/**
</span></span><span><span>     * @ORM\Column(name="idComment" type="integer")
</span></span><span><span>     * @ORM\Id()
</span></span><span><span>     * @ORM\GeneratedValue(strategy="AUTO")
</span></span><span><span>     */
</span></span><span>    <span>private $id;
</span></span><span>
</span><span>    <span>/* Other properties you need in your entity */
</span></span><span>
</span><span>    <span>/** @ORM\Column(name="created_at" type="datetime") */
</span></span><span>    <span>private $createdAt;
</span></span><span>
</span><span>    <span>/** @ORM\Column(name="updated_at" type="datetime") */
</span></span><span>    <span>private $updatedAt;
</span></span><span>
</span><span>    <span>/* Getters & Setters */
</span></span><span><span>}</span></span>
Nach dem Login kopieren

Hier ist eine ziemlich Merkmalsdatei, in die wir den ersten duplizierten Code verschoben haben. Sowohl $ createdat als auch $ updatatatatat sowie alle zugehörigen Methoden sind jetzt von den Entitäten getrennt. Infolgedessen wird es viel einfacher sein, sie woanders zu verwenden. Denken Sie an den Abschnitt "Einführung" mit dem Schlüsselwort verwendet.

Schritt 3: Refactor the Entities

Artikelentität

<span><span><?php
</span></span><span><span>// src/Blog/AppBundle/Entity/Traits/TimestampableTrait.php
</span></span><span>
</span><span><span>namespace Blog<span>\AppBundle\Entity\Traits</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span>
</span><span><span>trait TimestampableTrait
</span></span><span><span>{
</span></span><span>    <span>/**
</span></span><span><span>     * <span>@var datetime $createdAt
</span></span></span><span><span>     *
</span></span><span><span>     * @ORM\Column(name="created_at", type="datetime")
</span></span><span><span>     */
</span></span><span>    <span>private $createdAt;
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * <span>@var datetime $updatedAt
</span></span></span><span><span>     *
</span></span><span><span>     * @ORM\Column(name="updated_at", type="datetime")
</span></span><span><span>     */
</span></span><span>    <span>private $updatedAt;
</span></span><span>
</span><span>
</span><span>    <span>/**
</span></span><span><span>     * Get createdAt
</span></span><span><span>     *
</span></span><span><span>     * <span>@return datetime
</span></span></span><span><span>     */
</span></span><span>    <span>public function getCreatedAt()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->createdAt;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * Set createdAt
</span></span><span><span>     *
</span></span><span><span>     * <span>@param datetime $createdAt
</span></span></span><span><span>     */
</span></span><span>    <span>public function setCreatedAt($createdAt)
</span></span><span>    <span>{
</span></span><span>        <span>$this->createdAt = $createdAt;
</span></span><span>
</span><span>        <span>return $this;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * Get updatedAt
</span></span><span><span>     *
</span></span><span><span>     * <span>@return datetime
</span></span></span><span><span>     */
</span></span><span>    <span>public function getUpdatedAt()
</span></span><span>    <span>{
</span></span><span>        <span>return $this->updatedAt;
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * Set updatedAt
</span></span><span><span>     *
</span></span><span><span>     * <span>@param datetime $updatedAt
</span></span></span><span><span>     */
</span></span><span>    <span>public function setUpdatedAt($updatedAt)
</span></span><span>    <span>{
</span></span><span>        <span>$this->updatedAt = $updatedAt;
</span></span><span>
</span><span>        <span>return $this;
</span></span><span>    <span>}
</span></span><span><span>}</span></span>
Nach dem Login kopieren

Kommentar Entity

<span><span><?php
</span></span><span><span>// src/Blog/AppBundle/Entity/Article.php
</span></span><span>
</span><span><span>namespace Blog<span>\AppBundle\Entity</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span><span>use Blog<span>\AppBundle\Entity\Traits\TimestampableTrait</span>;
</span></span><span>
</span><span><span>class Article
</span></span><span><span>{
</span></span><span>    <span>use TimestampableTrait;
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * @ORM\Column(name="idArticle" type="integer")
</span></span><span><span>     * @ORM\Id()
</span></span><span><span>     * @ORM\GeneratedValue(strategy="AUTO")
</span></span><span><span>     */
</span></span><span>    <span>private $id;
</span></span><span>
</span><span>    <span>/* Other properties you need in your entity */
</span></span><span>
</span><span>    <span>/* Getters & Setters */
</span></span><span><span>}</span></span>
Nach dem Login kopieren

fertig! Lasst uns mit der Befehlszeile spielen. Erstellen wir zunächst die Entitäten in unserer Datenbank:

<span><span><?php
</span></span><span><span>// src/Blog/AppBundle/Entity/Comment.php
</span></span><span>
</span><span><span>namespace Blog<span>\AppBundle\Entity</span>;
</span></span><span>
</span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM;
</span></span><span><span>use Blog<span>\AppBundle\Entity\Traits\TimestampableTrait</span>;
</span></span><span>
</span><span><span>/**
</span></span><span><span> * @ORM\Table(name="comment")
</span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\CommentRepository")
</span></span><span><span> */
</span></span><span><span>class Comment
</span></span><span><span>{
</span></span><span>    <span>use TimestampableTrait;
</span></span><span>
</span><span>    <span>/**
</span></span><span><span>     * @ORM\Column(name="idComment" type="integer")
</span></span><span><span>     * @ORM\Id()
</span></span><span><span>     * @ORM\GeneratedValue(strategy="AUTO")
</span></span><span><span>     */
</span></span><span>    <span>private $id;
</span></span><span>
</span><span>    <span>/* Other properties you need in your entity */
</span></span><span>
</span><span>    <span>/* Getters & Setters */
</span></span><span><span>}</span></span>
Nach dem Login kopieren

Dieser Befehl würde ergeben:

php app/console doctrine:schema:create
Nach dem Login kopieren

Wenn Sie nun neue Objekte aus diesen Klassen erstellen möchten, würden Sie feststellen, dass beide die gemeinsamen Methoden verfügbar haben:

`Article Entity`
	
	| idArticle | *All our other fields...* | created_at | updated_at |
	|-----------|---------------------------|------------|------------|
	
	`Comment Entity`
	
	| idComment | *All our other fields...* | created_at | updated_at |
	|-----------|---------------------------|------------|------------|
Nach dem Login kopieren

Natürlich sind wir jetzt bereit, die Daten zu bestehen.

weiter

derzeit, im Symfony -Bereich, haften viele Bündel und Erweiterungen dazu, Dinge zu tun. Die Doctrinebehaviors -Bibliothek von KNPLABS bietet eine großartige Sammlung von Merkmalen für Unternehmen und Repositorys. In dem gleichen Geisteszustand empfehle ich Ihnen einen detaillierten Einblick in das bekannte Lehreextensionsbündel und insbesondere alles über die Zeitstempelverhaltenserweiterung.

endgültige Gedanken

Merkmale sind nicht schwer zu absorbieren. Sie sind eine hervorragende Möglichkeit, leichtere und flexiblere Code zu produzieren. Achten Sie darauf, sie nicht zu missbrauchen: Manchmal ist es besser, eine einzigartige Klassenimplementierung zu konstruieren. Ich kann nicht genug betonen, wie wichtig es ist, genügend Zeit zu nehmen, um Ihre App ordnungsgemäß zu entwerfen. Probieren Sie es aus, wenn Sie glauben, dass sie Ihnen helfen könnten. Erstellen Sie Ihre, testen Sie sie und sagen Sie uns, wie Sie sie verwendet haben!

häufig gestellte Fragen (FAQs) zur Verwendung von Merkmalen in Doktrinentitäten

Wie hoch sind die Vorteile der Verwendung von Merkmalen in Loktrinitätsunternehmen? Sie ermöglichen es Ihnen, wiederverwendbare Code -Snippets zu erstellen, die in verschiedene Klassen eingefügt werden können, um zusätzliche Funktionen bereitzustellen. Dies kann zu einem saubereren, wartbareren Code führen, da Sie das Duplizieren von Code in mehreren Klassen vermeiden können. Merkmale können auch verwendet werden, um Methoden in den Klassen zu überschreiben, in denen sie verwendet werden, und bietet ein leistungsstarkes Instrument zum Ändern des Verhaltens auf flexible Weise.

Wie benutze ich Merkmale in Loktrinentitäten? Dies erfolgt mit dem Schlüsselwort des Merkmals, gefolgt vom Namen des Merkmals und eines Codeblocks, der die Methoden und Eigenschaften enthält, die das Merkmal bietet. Sobald das Merkmal definiert ist, können Sie es in einer Klasse verwenden, indem Sie in der Klassendefinition eine Verwendung anhand der Klassendefinition hinzufügen, gefolgt vom Namen des Merkmals. Dies wird alle Methoden und Eigenschaften des Merkmals in der Klasse verfügbar machen. juristische Person. Dies geschieht durch Hinzufügen mehrerer Verwendungsanweisungen in der Klassendefinition, gefolgt vom Namen eines anderen Merkmals. Die Methoden und Eigenschaften aller Merkmale werden in der Klasse verfügbar sein. Wenn es einen Namenskonflikt zwischen Methoden oder Eigenschaften in verschiedenen Merkmalen gibt, können Sie ihn mithilfe der Stattdessen und als Operatoren beheben. , da sie keine Klassen sind und keine Konstruktorinjektion unterstützen. Sie können jedoch Dienste in die Klassen injizieren, die die Merkmale verwenden. Die Methoden des Merkmals können dann über die Klasse auf diese Dienste zugreifen. Durch Definieren einer Methode im Merkmal mit demselben Namen wie eine Methode in der Klasse. Wenn die Methode auf ein Objekt der Klasse aufgerufen wird, wird die Version im Merkmal anstelle der Version in der Klasse verwendet.

Kann ich Merkmale in Verbindung mit der Vererbung verwenden? Sie können Merkmale in Verbindung mit der Vererbung verwenden. Eine Klasse kann von einer übergeordneten Klasse erben und auch eine oder mehrere Eigenschaften verwenden. Die Methoden und Eigenschaften der übergeordneten Klasse und die Merkmale sind in der Klasse verfügbar. Wenn in der übergeordneten Klasse und ein Merkmal einen Namenskonflikt zwischen Methoden oder Eigenschaften gibt, wird die Version im Merkmal verwendet. Merkmale bieten ein leistungsstarkes Tool für die Wiederverwendung und Flexibilität von Code, sie haben auch einige Einschränkungen und potenzielle Nachteile. Eine Einschränkung besteht darin, dass Eigenschaften nicht alleine instanziiert werden können - sie können nur innerhalb einer Klasse verwendet werden. Wenn mehrere Merkmale eine Methode mit demselben Namen definieren, kann es Konflikte geben, die manuell gelöst werden müssen. Überbeanspruchung von Merkmalen kann auch zu Code führen, der schwer zu verstehen und aufrechtzuerhalten ist, daher sollten sie mit Bedacht verwendet werden.

Wie teste ich Lehren, die Merkmale verwenden? Sie können Unit -Tests erstellen, die die Entität instanziieren und ihre Methoden aufrufen, um zu überprüfen, ob sie sich wie erwartet verhalten. Wenn ein Merkmal zusätzliche Methoden liefert, können Sie diese auf die gleiche Weise testen. Wenn ein Merkmal eine Methode in der Entität überschreibt, sollten Sie sowohl die ursprüngliche Version der Methode (indem Sie sie auf einer Entität testen, die das Merkmal nicht verwendet) als auch die überschriebene Version (indem Sie es auf einer Entität testen, die das Merkmal verwendet), testen). .

Kann ich Merkmale in Lektionsentitäten mit Symfony verwenden? Die Doktrinintegration von Symfony unterstützt die Verwendung von Merkmalen bei Unternehmen. Sie können Ihre Eigenschaften definieren, sie in Ihren Entitäten verwenden, und Symfony erkennen und verwenden sie bei der Arbeit mit Ihren Unternehmen. Mit Merkmalen in Loktrierunternehmen ähneln die Debugging -Probleme mit regelmäßigen Loktrierunternehmen. Sie können Tools wie Xdebug und var_dump () verwenden, um den Zustand Ihrer Entitäten zu inspizieren und zu sehen, welche Methoden und Eigenschaften sie haben. Wenn sich eine Methode nicht wie erwartet verhält, können Sie überprüfen, ob sie in der Entität selbst, in einem Merkmal oder in einer übergeordneten Klasse definiert ist, und entsprechend debuggen.

Das obige ist der detaillierte Inhalt vonVerwenden von Merkmalen in Lektionsunternehmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage