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.
Heute werde ich Ihnen zeigen, wie sie mit Lehre in einer Symfony -Umgebung verwendet werden können.
<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>
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.
<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>
<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>
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?
<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>
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.
<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>
<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>
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>
Dieser Befehl würde ergeben:
php app/console doctrine:schema:create
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 | |-----------|---------------------------|------------|------------|
Natürlich sind wir jetzt bereit, die Daten zu bestehen.
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.
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!
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.
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!