Rumah pembangunan bahagian belakang tutorial php PHP中的Traits使用方法汇总

PHP中的Traits使用方法汇总

Jul 03, 2017 am 11:20 AM
php traits Cara menggunakan

PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法。php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait名称,而具体某个Trait的声明使用trait关键词,Trait不能直接实例化。具体用法请看下面的代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<?php

  trait Drive {

    public $carName = &#39;trait&#39;;

    public function driving() {

      echo "driving {$this->carName}\n";

    }

  }

  class Person {

    public function eat() {

      echo "eat\n";

    }

  }

  class Student extends Person {

    use Drive;

    public function study() {

      echo "study\n";

    }

  }

  $student = new Student();

  $student->study();

  $student->eat();

  $student->driving();

Salin selepas log masuk

输出结果如下:

1

2

3

study

eat

driving trait

Salin selepas log masuk

上面的例子中,Student类通过继承Person,有了eat方法,通过组合Drive,有了driving方法和属性carName。

如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?通过下面的代码测试一下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

<?php

  trait Drive {

    public function hello() {

      echo "hello drive\n";

    }

    public function driving() {

      echo "driving from drive\n";

    }

  }

  class Person {

    public function hello() {

      echo "hello person\n";

    }

    public function driving() {

      echo "driving from person\n";

    }

  }

  class Student extends Person {

    use Drive;

    public function hello() {

      echo "hello student\n";

    }

  }

  $student = new Student();

  $student->hello();

  $student->driving();

Salin selepas log masuk

输出结果如下:

1

2

hello student

driving from drive

Salin selepas log masuk

因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。

如果要组合多个Trait,通过逗号分隔 Trait名称:

use Trait1, Trait2;

如果多个Trait中包含同名方法或者属性时,会怎样呢?答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?php

trait Trait1 {

  public function hello() {

    echo "Trait1::hello\n";

  }

  public function hi() {

    echo "Trait1::hi\n";

  }

}

trait Trait2 {

  public function hello() {

    echo "Trait2::hello\n";

  }

  public function hi() {

    echo "Trait2::hi\n";

  }

}

class Class1 {

  use Trait1, Trait2;

}

Salin selepas log masuk

输出结果如下:

1

PHP Fatal error: Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20

Salin selepas log masuk

使用insteadof和as操作符来解决冲突,insteadof是使用某个方法替代另一个,而as是给方法取一个别名,具体用法请看代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<?php

trait Trait1 {

  public function hello() {

    echo "Trait1::hello\n";

  }

  public function hi() {

    echo "Trait1::hi\n";

  }

}

trait Trait2 {

  public function hello() {

    echo "Trait2::hello\n";

  }

  public function hi() {

    echo "Trait2::hi\n";

  }

}

class Class1 {

  use Trait1, Trait2 {

    Trait2::hello insteadof Trait1;

    Trait1::hi insteadof Trait2;

  }

}

class Class2 {

  use Trait1, Trait2 {

    Trait2::hello insteadof Trait1;

    Trait1::hi insteadof Trait2;

    Trait2::hi as hei;

    Trait1::hello as hehe;

  }

}

$Obj1 = new Class1();

$Obj1->hello();

$Obj1->hi();

echo "\n";

$Obj2 = new Class2();

$Obj2->hello();

$Obj2->hi();

$Obj2->hei();

$Obj2->hehe();

Salin selepas log masuk

输出结果如下:

1

2

3

4

5

6

7

Trait2::hello

Trait1::hi

 

Trait2::hello

Trait1::hi

Trait2::hi

Trait1::hello

Salin selepas log masuk

as关键词还有另外一个用途,那就是修改方法的访问控制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?php

  trait Hello {

    public function hello() {

      echo "hello,trait\n";

    }

  }

  class Class1 {

    use Hello {

      hello as protected;

    }

  }

  class Class2 {

    use Hello {

      Hello::hello as private hi;

    }

  }

  $Obj1 = new Class1();

  $Obj1->hello(); # 报致命错误,因为hello方法被修改成受保护的

  $Obj2 = new Class2();

  $Obj2->hello(); # 原来的hello方法仍然是公共的

  $Obj2->hi(); # 报致命错误,因为别名hi方法被修改成私有的

Salin selepas log masuk

Trait 也能组合Trait,Trait中支持抽象方法、静态属性及静态方法,测试代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<?php

trait 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();

$Obj->sayWorld();

echo $Obj->getWorld() . "\n";

HelloWorld::doSomething();

$Obj->inc();

$Obj->inc();

Salin selepas log masuk

输出结果如下:

1

2

3

4

5

6

Hello

World

get World

Doing something

1

2

Salin selepas log masuk

Atas ialah kandungan terperinci PHP中的Traits使用方法汇总. 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

Video Face Swap

Video Face Swap

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

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

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

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

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

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

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