Rumah >pembangunan bahagian belakang >tutorial php >Menggunakan ciri -ciri dalam Php 5.4

Menggunakan ciri -ciri dalam Php 5.4

Joseph Gordon-Levitt
Joseph Gordon-Levittasal
2025-02-28 10:15:55218semak imbas

Panduan untuk menggunakan ciri -ciri dalam Php 5.4

Using Traits in PHP 5.4

mata teras

    Mekanisme ciri -ciri yang diperkenalkan dalam Php 5.4 membolehkan penggunaan semula kod mendatar antara kelas independen hierarki warisan, menyelesaikan batasan warisan tunggal dan mengurangkan duplikasi kod.
  • Kelas tunggal boleh menggunakan pelbagai ciri, dan ciri -ciri juga boleh terdiri daripada ciri -ciri lain, membolehkan cara penganjuran kod yang fleksibel dan modular.
  • Gunakan kata kunci
  • untuk menyelesaikan konflik antara ciri -ciri dengan nama kaedah yang sama, atau untuk membuat kaedah alias menggunakan kata kunci insteadof. as Ciri -ciri
  • boleh mengakses sifat peribadi atau kaedah kelas komposit, dan sebaliknya, dan juga boleh mengandungi kaedah abstrak yang mesti dilaksanakan oleh kelas komposit.
Matlamat penting pengaturcaraan berorientasikan objek adalah untuk meminimumkan duplikasi kod melalui penggunaan semula organisasi dan kod yang lebih baik. Tetapi dalam PHP, ini kadang -kadang sukar kerana batasan model warisan tunggal yang digunakannya; Bahasa seperti C dan Python membolehkan kita mewarisi dari pelbagai kelas, yang menyelesaikan masalah ini sedikit sebanyak, sementara Mixin dalam Ruby membolehkan kita mencampurkan fungsi satu atau lebih kelas tanpa menggunakan warisan. Walau bagaimanapun, pelbagai warisan mempunyai masalah seperti masalah berlian, dan mixin juga merupakan mekanisme yang kompleks. Dalam artikel ini, saya akan membincangkan ciri -ciri, ciri baru yang diperkenalkan dalam Php 5.4 untuk mengatasi masalah tersebut. Konsep sifat itu sendiri bukanlah baru dalam pengaturcaraan dan digunakan dalam bahasa lain seperti Scala dan Perl. Mereka membolehkan kita menggunakan semula kod semula antara kelas bebas dengan kelas yang berbeza yang mewarisi hierarki.

Penampilan Trait

sifat adalah serupa dengan kelas abstrak yang tidak dapat ditandakan secara berasingan (walaupun lebih kerap dibandingkan dengan antara muka). Dokumen PHP mentakrifkan ciri -ciri seperti berikut: & gt; Tujuan ciri -ciri adalah untuk mengurangkan beberapa batasan warisan tunggal dengan membolehkan pemaju untuk menggunakan semula kaedah yang ditetapkan secara bebas dalam beberapa kelas bebas (yang ada dalam hierarki warisan kelas yang berbeza).

mari kita pertimbangkan contoh ini:

<code class="language-php"><?php
class DbReader extends Mysqli
{
}

class FileReader extends SplFileObject
{
}</code>
Ia akan menjadi masalah jika kedua -dua kelas memerlukan beberapa fungsi biasa, seperti menjadikan mereka kedua -dua orang. Oleh kerana PHP tidak menyokong pelbagai warisan, setiap kelas mesti melaksanakan kod yang diperlukan yang menyokong corak singleton, atau akan ada hierarki warisan yang tidak bermakna. Ciri -ciri menyediakan penyelesaian kepada jenis masalah ini.

<code class="language-php"><?php
trait Singleton
{
    private static $instance;

    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}

class DbReader extends ArrayObject
{
    use Singleton;
}

class  FileReader
{
    use Singleton;
}</code>
Singleton Ciri dilaksanakan dalam pelaksanaan langsung corak singleton, dengan kaedah statik

yang menggunakan sifat ini untuk membuat objek kelas (jika belum dicipta) dan mengembalikannya. Mari cuba buat objek kelas ini menggunakan kaedah getInstance(). getInstance()

<code class="language-php"><?php
class DbReader extends Mysqli
{
}

class FileReader extends SplFileObject
{
}</code>

kita dapat melihat bahawa $a adalah objek DbReader dan $b adalah objek FileReader, tetapi kedua -duanya kini muncul sebagai singleton. Kaedah dari Singleton telah disuntik secara mendatar ke dalam kelas yang menggunakannya. Ciri -ciri tidak mengenakan apa -apa semantik tambahan di kelas. Untuk beberapa tahap, anda boleh memikirkannya sebagai mekanisme salinan yang dibantu oleh pengkompil di mana kaedah Trait disalin ke dalam kelas komposit. Jika kita hanya subclass $instance dari kelas induk dengan atribut swasta, atribut tidak akan dipaparkan dalam pembuangan DbReader. Walau bagaimanapun, dengan ciri -ciri, ada di sana! ReflectionClass::export()

<code class="language-php"><?php
trait Singleton
{
    private static $instance;

    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }
}

class DbReader extends ArrayObject
{
    use Singleton;
}

class  FileReader
{
    use Singleton;
}</code>

Ciri -ciri berganda

Setakat ini, kita hanya menggunakan satu sifat dalam satu kelas, tetapi dalam beberapa kes kita mungkin perlu menggabungkan fungsi pelbagai ciri.

<code class="language-php"><?php
$a = DbReader::getInstance();
$b = FileReader::getInstance();
var_dump($a);  //object(DbReader)
var_dump($b);  //object(FileReader)</code>
di sini kita mempunyai dua ciri,

dan Hello. Sifat hanya boleh mengatakan "hello", World sifat hanya boleh mengatakan "dunia". Dalam kelas Hello, kami menggunakan World dan MyWorld supaya objek Hello akan mempunyai kaedah dari kedua -dua ciri ini dan akan dapat mengatakan "Hello World". World Sifat -sifat yang terdiri daripada ciri -ciri MyWorld

Apabila aplikasi berkembang, kami mungkin akan mempunyai satu set ciri yang digunakan dalam kelas yang berbeza. Php 5.4 membolehkan kita mempunyai ciri -ciri yang terdiri daripada ciri -ciri lain supaya kita hanya perlu memasukkan pelbagai ciri dalam satu ciri, bukannya pelbagai ciri dalam semua kelas ini. Ini membolehkan kita menulis semula contoh sebelumnya seperti berikut:

di sini, kami mencipta sifat

, menggunakan ciri -ciri

dan
<code>Class [  class FileReader ] {
  @@ /home/shameer/workplace/php54/index.php 19-22

  - Constants [0] {
  }
  - Static properties [1] {
    Property [ private static $_instance ]
  }
  - Static methods [1] {
    Method [  static public method instance ] {
      @@ /home/shameer/workplace/php54/index.php 6 - 11
    }
  }
  - Properties [0] {
  }
  - Methods [0] {
  }
}</code>
, dan memasukkannya ke dalam

. Oleh kerana sifat HelloWorld mempunyai kaedah dari dua ciri lain, ia sama seperti jika kita memasukkan kedua -dua ciri ini di dalam kelas. Hello World MyWorld (Kandungan berikut akan diringkaskan secara ringkas kerana batasan ruang dan maklumat teras yang disimpan) HelloWorld

Kaedah Keutamaan:

Kaedah Trait mempunyai keutamaan yang lebih tinggi daripada kaedah kelas induk, dan kaedah kelas mempunyai keutamaan yang lebih tinggi daripada kaedah sifat.

Resolusi Konflik dan alias:

Gunakan untuk memilih kaedah sifat yang hendak digunakan, dan gunakan untuk membuat kaedah alias untuk mengelakkan konflik.

Refleksi: insteadof as Menyediakan kaedah untuk mendapatkan maklumat ciri -ciri dalam kelas, seperti

,

, , dan . ReflectionClass Ciri -ciri lain: getTraits() Ciri -ciri boleh mengakses sifat -sifat peribadi dan kaedah kelas gabungan, dan sebaliknya; getTraitNames() isTrait() getTraitAliases() Ringkasan:

Ciri -ciri

adalah salah satu ciri yang paling kuat yang diperkenalkan dalam Php 5.4, dan artikel ini membincangkan hampir semua ciri -cirinya. Mereka membenarkan pengaturcara untuk menggunakan semula coretan kod secara mendatar antara pelbagai kelas yang tidak perlu berada dalam hierarki warisan yang sama. Mereka menyediakan mekanisme penggunaan semula kod ringan dan bukan semantik yang kompleks. Walaupun terdapat beberapa kelemahan ciri -ciri, mereka pasti dapat membantu memperbaiki reka bentuk aplikasi anda, menghapuskan duplikasi kod, dan menjadikannya lebih kering.

(bahagian Soalan Lazim ditinggalkan di sini kerana panjang artikel. Maklumat teras telah diliputi dalam kandungan di atas.)

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

Kenyataan:
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