Rumah > pembangunan bahagian belakang > tutorial php > Menggunakan ciri -ciri dalam entiti doktrin

Menggunakan ciri -ciri dalam entiti doktrin

Jennifer Aniston
Lepaskan: 2025-02-19 09:20:11
asal
581 orang telah melayarinya

Menggunakan ciri -ciri dalam entiti doktrin

Takeaways Key

Ciri -ciri
    , yang tersedia sejak Php 5.4.0, menyediakan cara untuk menggunakan semula kod dengan memasukkan satu set kaedah dalam kelas lain, mengurangkan pengulangan kod. Mereka boleh digunakan bersempena dengan doktrin Orm dalam persekitaran simfoni.
  • Ciri -ciri tidak boleh dikelirukan dengan antara muka. Walaupun antara muka adalah kontrak yang menyatakan apa objek yang boleh dilakukan, sifat memberikan objek keupayaan untuk melakukannya.
  • Ciri -ciri
  • boleh menjadi sangat berguna dalam menganjurkan seni bina pangkalan data dan mengelakkan duplikasi kod. Sebagai contoh, apabila membuat artikel dan entiti komen yang kedua -duanya memerlukan bidang 'created_at' dan 'dikemas kini', sifat -sifat biasa ini boleh dimasukkan ke dalam sifat untuk mengelakkan pengulangan.
  • Walaupun ciri -ciri adalah alat yang sangat baik untuk menghasilkan kod yang lebih ringan dan lebih fleksibel, mereka tidak boleh digunakan terlalu banyak. Kadang -kadang, mungkin lebih baik untuk membina pelaksanaan kelas yang unik. Adalah penting untuk mengambil masa yang cukup untuk merancang aplikasi anda dengan betul.
Sejak PHP 5.4.0, PHP menyokong cara yang cantik untuk menggunakan semula kod yang dipanggil "Ciri -ciri" - satu set kaedah yang boleh anda sertakan dalam kelas lain agar tidak mengulangi diri anda. Anda boleh membaca lebih lanjut mengenai ciri -ciri dalam jawatan SitePoint yang diterbitkan sebelum ini: Di ​​sini, di sini dan di sini.

Menggunakan ciri -ciri dalam entiti doktrin hari ini, saya akan menunjukkan kepada anda bagaimana mereka boleh digunakan dengan doktrin Orm dalam persekitaran simfoni.

Asas Trait

<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>
Salin selepas log masuk
Salin selepas log masuk
Seperti yang dapat kita lihat, kaedah asas SayHello () diisytiharkan di dalam sifat yang dilaksanakan oleh kedua -dua kelas A dan B dengan pernyataan penggunaan. Mudah, bukan? Contoh ini benar -benar pendek tetapi ia harus memberi anda pengetahuan asas untuk bekerja dengan ciri -ciri.

Jika anda berminat dengan ciri -ciri, saya cadangkan anda membaca dokumentasi rasmi dan sebelum ini diterbitkan SitePoint Posts di sini, di sini dan di sini, untuk memahami sepenuhnya konsep tersebut.

Izinkan saya memberi amaran kepada anda tentang hakikat bahawa ramai orang cenderung untuk tidak melihat perbezaan antara ciri -ciri dan antara muka. Berikut adalah penjelasan pragmatik:

Antara muka adalah kontrak yang mengatakan "objek ini dapat melakukan perkara ini", sedangkan sifat memberikan objek keupayaan untuk melakukan perkara itu.

Untuk penjelasan yang lebih mendalam, jangan ragu untuk melihat jawatan ini oleh Philip Brown, yang mana petikan sebelumnya berasal.

Ketika menganjurkan seni bina pangkalan data seseorang, ia tidak biasa untuk menghadapi duplikasi kod. Sebagai contoh, katakan kita perlu membangunkan aplikasi blog biasa. Pada satu ketika, kemungkinan kita akan membuat entiti artikel asas dan mungkin entiti komen juga.

Kedua -dua entiti akan mendapat manfaat daripada medan Created_at dan Updated_at (jadi kami boleh menyusun hasil pada lajur tersebut kemudian). Tetapi sebelum menggali ciri -ciri, mari kita lihat bagaimana kita dapat membina entiti tersebut dalam doktrin tanpa mereka.

Langkah 1: Buat entiti

Entiti artikel

<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>
Salin selepas log masuk
Salin selepas log masuk

entiti komen

<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>
Salin selepas log masuk

sifat yang sama $ createdAt dan $ updateDAt dimasukkan ke dalam kedua -dua kelas. Ini jauh dari kering. Adakah ciri -ciri dapat membantu kita membersihkan kod ini?

Langkah 2: Buat sifat

<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>
Salin selepas log masuk

Berikut adalah fail sifat yang cantik di mana kami telah memindahkan kod pendua awal. Kedua -dua $ createat dan $ terkini serta semua kaedah yang berkaitan kini dipisahkan dari entiti. Akibatnya, lebih mudah menggunakannya di tempat lain. Ingat bahagian Pengenalan dengan penggunaan kata kunci.

Langkah 3: Refactor Entities

Entiti artikel

<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>
Salin selepas log masuk

entiti komen

<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>
Salin selepas log masuk

selesai! Mari kita bermain dengan baris arahan. Pertama, mari buat entiti dalam pangkalan data kami:

<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>
Salin selepas log masuk

Perintah ini akan menghasilkan:

php app/console doctrine:schema:create
Salin selepas log masuk

Sekarang, jika anda ingin membuat objek baru dari kelas ini, anda akan mendapati bahawa kedua -duanya mempunyai kaedah biasa yang tersedia:

`Article Entity`
	
	| idArticle | *All our other fields...* | created_at | updated_at |
	|-----------|---------------------------|------------|------------|
	
	`Comment Entity`
	
	| idComment | *All our other fields...* | created_at | updated_at |
	|-----------|---------------------------|------------|------------|
Salin selepas log masuk

Jelas sekali, kami kini bersedia untuk meneruskan data.

pergi lebih jauh

Pada masa ini, dalam bidang Symfony, banyak berkas dan sambungan cenderung untuk berpegang pada cara ini melakukan sesuatu. Perpustakaan Doctrinebehaviors dari Knplabs menyediakan koleksi ciri -ciri yang hebat untuk entiti dan repositori. Dalam keadaan minda yang sama, saya cadangkan anda mempunyai pandangan yang mendalam pada bundle DoctrineExtensions yang terkenal dan terutama sekali tentang pelanjutan tingkah laku yang boleh dijangka.

Pemikiran Akhir

ciri -ciri tidak sukar diserap. Mereka adalah cara terbaik untuk menghasilkan kod yang lebih ringan dan lebih fleksibel. Berhati -hati untuk tidak menyalahgunakannya: Kadang -kadang, lebih baik untuk membina pelaksanaan kelas yang unik. Saya tidak dapat menekankan betapa pentingnya untuk mengambil masa yang cukup untuk merancang aplikasi anda dengan betul. Beri mereka pergi jika anda fikir mereka boleh membantu anda. Buat milik anda, uji mereka dan beritahu kami bagaimana anda menggunakannya!

Soalan Lazim (Soalan Lazim) Mengenai Menggunakan Ciri -ciri dalam Entiti Doktrin

Apakah faedah menggunakan ciri -ciri dalam entiti doktrin? Mereka membolehkan anda membuat coretan kod yang boleh diguna semula yang boleh dimasukkan ke dalam kelas yang berbeza untuk menyediakan fungsi tambahan. Ini boleh membawa kepada kod yang lebih bersih, lebih banyak dikekalkan, kerana anda boleh mengelakkan kod pendua di pelbagai kelas. Ciri -ciri juga boleh digunakan untuk mengatasi kaedah dalam kelas yang digunakan, menyediakan alat yang berkuasa untuk mengubah tingkah laku dengan cara yang fleksibel.

Bagaimana saya menggunakan ciri -ciri dalam entiti doktrin? Ini dilakukan dengan menggunakan kata kunci sifat, diikuti dengan nama sifat dan blok kod yang mengandungi kaedah dan sifat yang disediakan oleh sifatnya. Sebaik sahaja sifatnya ditakrifkan, anda boleh menggunakannya dalam kelas dengan menambahkan pernyataan penggunaan di dalam definisi kelas, diikuti dengan nama sifat tersebut. Ini akan menjadikan semua kaedah dan sifat sifat yang terdapat di dalam kelas. entiti. Ini dilakukan dengan menambahkan beberapa pernyataan penggunaan di dalam definisi kelas, masing -masing diikuti dengan nama sifat yang berbeza. Kaedah dan sifat semua ciri akan tersedia di kelas. Sekiranya terdapat konflik penamaan antara kaedah atau sifat dalam ciri -ciri yang berbeza, anda boleh menyelesaikannya menggunakan pengendali dan sebagai pengendali. , kerana mereka bukan kelas dan tidak menyokong suntikan pembina. Walau bagaimanapun, anda boleh menyuntik perkhidmatan ke dalam kelas yang menggunakan ciri -ciri. Kaedah -kaedah sifat itu kemudian dapat mengakses perkhidmatan ini melalui kelas. dilakukan dengan menentukan kaedah dalam sifat dengan nama yang sama sebagai kaedah dalam kelas. Apabila kaedah dipanggil pada objek kelas, versi dalam sifat akan digunakan dan bukannya versi di dalam kelas. , Anda boleh menggunakan ciri -ciri bersempena dengan warisan. Kelas boleh mewarisi dari kelas induk dan juga menggunakan satu atau lebih sifat. Kaedah dan sifat kelas induk dan ciri -ciri semuanya boleh didapati di kelas. Sekiranya terdapat konflik penamaan antara kaedah atau sifat dalam kelas induk dan sifat, versi dalam sifat akan digunakan. Ciri -ciri menyediakan alat yang berkuasa untuk penggunaan semula kod dan fleksibiliti, mereka juga mempunyai beberapa batasan dan kelemahan yang berpotensi. Satu batasan adalah bahawa ciri -ciri tidak dapat diterapkan sendiri - mereka hanya boleh digunakan dalam kelas. Selain itu, jika pelbagai ciri menentukan kaedah dengan nama yang sama, terdapat konflik penamaan yang perlu diselesaikan secara manual. Lebih banyak ciri -ciri juga boleh membawa kepada kod yang sukar difahami dan dikekalkan, jadi mereka harus digunakan dengan bijak.

Bagaimana saya menguji entiti doktrin yang menggunakan ciri -ciri? Anda boleh membuat ujian unit yang memberi instantiate entiti dan memanggil kaedahnya, memeriksa bahawa mereka berkelakuan seperti yang diharapkan. Jika sifat menyediakan kaedah tambahan, anda boleh menguji ini dengan cara yang sama. Sekiranya sifat mengatasi kaedah dalam entiti, anda harus menguji kedua -dua versi asal kaedah (dengan mengujinya pada entiti yang tidak menggunakan sifat) dan versi yang ditindas (dengan mengujinya pada entiti yang menggunakan sifatnya) . Integrasi doktrin Symfony menyokong penggunaan ciri -ciri dalam entiti. Anda boleh menentukan ciri -ciri anda, menggunakannya di entiti anda, dan Symfony akan mengenali dan menggunakannya semasa bekerja dengan entiti anda. Dengan ciri -ciri dalam entiti doktrin adalah serupa dengan isu debugging dengan entiti doktrin biasa. Anda boleh menggunakan alat seperti XDEBUG dan VAR_DUMP () untuk memeriksa keadaan entiti anda dan melihat kaedah dan sifat apa yang mereka ada. Sekiranya kaedah tidak berkelakuan seperti yang diharapkan, anda boleh menyemak sama ada ia ditakrifkan dalam entiti itu sendiri, dalam sifat, atau dalam kelas induk, dan debug sewajarnya.

Atas ialah kandungan terperinci Menggunakan ciri -ciri dalam entiti doktrin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan