Menggunakan ciri -ciri dalam entiti doktrin
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.

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>
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>
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>
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>
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>
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>
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>
Perintah ini akan menghasilkan:
php app/console doctrine:schema:create
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 | |-----------|---------------------------|------------|------------|
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Alipay Php ...

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Sesi rampasan boleh dicapai melalui langkah -langkah berikut: 1. Dapatkan ID Sesi, 2. Gunakan ID Sesi, 3. Simpan sesi aktif. Kaedah untuk mengelakkan rampasan sesi dalam PHP termasuk: 1. Gunakan fungsi Sesi_Regenerate_ID () untuk menjana semula ID Sesi, 2. Data sesi stor melalui pangkalan data, 3.

Penerapan prinsip pepejal dalam pembangunan PHP termasuk: 1. Prinsip Tanggungjawab Tunggal (SRP): Setiap kelas bertanggungjawab untuk hanya satu fungsi. 2. Prinsip Terbuka dan Tutup (OCP): Perubahan dicapai melalui lanjutan dan bukannya pengubahsuaian. 3. Prinsip Penggantian Lisch (LSP): Subkelas boleh menggantikan kelas asas tanpa menjejaskan ketepatan program. 4. Prinsip Pengasingan Antara Muka (ISP): Gunakan antara muka halus untuk mengelakkan kebergantungan dan kaedah yang tidak digunakan. 5. Prinsip Inversi Ketergantungan (DIP): Modul peringkat tinggi dan rendah bergantung kepada abstraksi dan dilaksanakan melalui suntikan ketergantungan.

Fungsi penghitungan dalam Php8.1 meningkatkan kejelasan dan jenis keselamatan kod dengan menentukan pemalar yang dinamakan. 1) Penghitungan boleh menjadi bilangan bulat, rentetan atau objek, meningkatkan kebolehbacaan kod dan keselamatan jenis. 2) Penghitungan adalah berdasarkan kelas dan menyokong ciri-ciri berorientasikan objek seperti traversal dan refleksi. 3) Penghitungan boleh digunakan untuk perbandingan dan tugasan untuk memastikan keselamatan jenis. 4) Penghitungan menyokong penambahan kaedah untuk melaksanakan logik kompleks. 5) Pemeriksaan jenis dan pengendalian ralat yang ketat boleh mengelakkan kesilapan biasa. 6) Penghitungan mengurangkan nilai sihir dan meningkatkan keupayaan, tetapi memberi perhatian kepada pengoptimuman prestasi.

Bagaimana cara debug mod CLI dalam phpstorm? Semasa membangun dengan PHPStorm, kadang -kadang kita perlu debug PHP dalam mod Interface Line Command (CLI) ...

Bagaimana untuk menetapkan keizinan UnixSocket secara automatik selepas sistem dimulakan semula. Setiap kali sistem dimulakan semula, kita perlu melaksanakan perintah berikut untuk mengubahsuai keizinan UnixSocket: sudo ...

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.
