Rumah pembangunan bahagian belakang tutorial php 【php类与对象】trait

【php类与对象】trait

Apr 17, 2018 pm 03:01 PM
php trait


这篇文章介绍的内容是关于【php类与对象】trait ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

Trait (PHP 5.4.0 )

翻译Trait

  • Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。

  • Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。

  • Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。

  • Trait 为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。


优先级

从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。
(当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。)

#Example #2 优先顺序示例<?phpclass Bases {
    public function sayHello() {
        echo &#39;Hello &#39;;
    }
}trait SayWorld {    public function sayHello() {
        parent::sayHello();        echo &#39;World!&#39;;
    }
}class MyHelloWorld extends Bases {
    // public function sayHello(){
    //     echo &#39;the class&#39;;
    // }
    use SayWorld;
}$o = new MyHelloWorld();$o->sayHello();    //output:   Hello World!?>
Salin selepas log masuk
Example #3 另一个优先级顺序的例子<?phptrait HelloWorld {    public function sayHello() {
        echo &#39;Hello World!&#39;;
    }
}class TheWorldIsNotEnough {
    use HelloWorld;    public function sayHello() {
        echo &#39;Hello Universe!&#39;;
    }
}$o = new TheWorldIsNotEnough();$o->sayHello();    //output:   Hello Universe!?>
Salin selepas log masuk

多个 trait

通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。

Example #4 多个 trait 的用法<?phptrait Hello {    public function sayHello() {
        echo &#39;Hello &#39;;
    }
}trait World {    public function sayWorld() {
        echo &#39;World&#39;;
    }
}class MyHelloWorld {
    use Hello, World;    public function sayExclamationMark() {
        echo &#39;!&#39;;
    }
}$o = new MyHelloWorld();$o->sayHello();$o->sayWorld();$o->sayExclamationMark();//output: Hello World!?>
Salin selepas log masuk

命名冲突

如果两个 trait 都插入了一个同名的方法,而没有明确解决冲突将会产生一个致命错误。

为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。

以上方式仅允许排除掉其它方法,as 操作符可以 为某个方法引入别名。 注意,as 操作符不会对方法进行重命名,也不会影响其方法。

<?phptrait A {    public function a() {
        echo &#39;a1&#39;;
    }    public function b() {
        echo &#39;a2&#39;;
    }
}trait B {    public function a() {
        echo &#39;b1&#39;;
    }    public function b() {
        echo &#39;b2&#39;;
    }
}class C {
    use A, B {        B::a insteadof A;//insteadof 指定B类中的a方法在A类中,以解决命名冲突
        B::b insteadof A;
        A::a as a1;//把A类中的a方法取别名为a1,以解决命名冲突
        A::B as a2;
    }
}$C = new C();$C -> a();//b1$C -> b();//b2$C -> a1();//a1$C -> a2();//a2?>
Salin selepas log masuk

as 还可修改方法的访问控制

Example #6 修改方法的访问控制<?php
    trait Hello {        public function traitHello() {
            echo "hello,trait\n";
        }
    }    // 修改 traitHello 的访问控制
    class Class1 {
        use Hello {            traitHello as protected;
        }
    }    // 给方法一个访问控制的别名,原版 traitHello 的访问控制则没有发生变化
    class Class2 {
        use Hello {            Hello::traitHello as private hi;
        }
    }    $Obj1 = new Class1();    // $Obj1->traitHello(); # 报致命错误,因为traitHello方法被修改成受保护的
    $Obj2 = new Class2();    $Obj2->traitHello(); # 原来的traitHello方法仍然是公共的
    // $Obj2->hi();  # 报致命错误,因为别名hi方法被修改成私有的
Salin selepas log masuk

Trait 也能组合Trait

Trait中支持抽象方法、静态属性及静态方法

<?phptrait Hello {    public function sayHello() {
        echo "Hello\n";
    }
}trait World {    use Hello;    public function sayWorld() {
        echo "World\n";
    }    abstract public function getWorld();
    public function inc() {
        static $c = 0;        $c = $c + 1;        echo "$c\n";
    }    public static function doSomething() {
        echo "Doing something\n";
    }
}class HelloWorld {
    use World;    public function getWorld() {
        return &#39;get World&#39;;
    }
}$Obj = new HelloWorld();$Obj->sayHello();//Hello$Obj->sayWorld();//Worldecho $Obj->getWorld() . "\n";////get WorldHelloWorld::doSomething();//Doing something$Obj->inc();//1$Obj->inc();//2
Salin selepas log masuk

Trait 定义了一个属性后,类就不能定义同样名称的属性,否则会产生 fatal error。 有种情况例外:属性是兼容的(同样的访问可见度、初始默认值)。 在 PHP 7.0 之前,属性是兼容的,则会有 E_STRICT 的提醒。

Example #12 解决冲突<?phptrait PropertiesTrait {    public $same = true;    public $different = false;
}class PropertiesExample {
    use PropertiesTrait;    public $same = true; // PHP 7.0.0 后没问题,之前版本是 E_STRICT 提醒
    public $different = true; // 致命错误}?>
Salin selepas log masuk

相关推荐:

【php类与对象】Final 关键字

【php类与对象】后期静态绑定

【php类与对象】类型约束

Atas ialah kandungan terperinci 【php类与对象】trait . 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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini 7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini Nov 13, 2024 am 09:42 AM

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

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,

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

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.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

See all articles