当前位置:首页 > PHP教程 > php应用 > 列表

PHP之认识(二)关于Traits的用法详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-16 11:29:56 浏览: 评论:0 

PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法,Traits的出现解决了这一问题。

1、通过在类中使用use关键字声明要组合的Trait名称,而具体某个Trait的声明使用trait关键词,Trait不能直接实例化,具体用法:

  1. <?php 
  2. trait Person{ 
  3.     public $name="person"; 
  4.     public function talk(){ 
  5.         echo "我是{$this->name}<br/>"; 
  6.     } 
  7. } 
  8. class Teacher{ 
  9.     public function speak(){ 
  10.         echo "我能教书<br/>"; 
  11.     } 
  12. } 
  13. class Student extends Teacher{ 
  14.     use Person; 
  15.     public function study(){ 
  16.         echo "我需要学习<br/>"; 
  17.     } 
  18. } 
  19. $student = new Student(); 
  20. $student->talk(); 
  21. $student->speak(); 
  22. $student->study(); 
  23. ?> 

2、Trait、父类和本类中都存在某个同名的属性或者方法是,会保留哪一个?

  1. <?php 
  2. trait Person{ 
  3.     public $name="person"; 
  4.     public function talk(){ 
  5.         echo "我是{$this->name}<br/>"; 
  6.     } 
  7.      public function hello() { 
  8.     echo "hello Person<br/>"; 
  9.   } 
  10. } 
  11. class Teacher{ 
  12.     public function talk(){ 
  13.         echo "我能教书<br/>"; 
  14.     } 
  15.      public function hello() { 
  16.     echo "hello Teacher<br/>"; 
  17.   } 
  18. } 
  19. class Student extends Teacher{ 
  20.     use Person; 
  21.     public function talk(){ 
  22.         echo "我需要学习<br/>"; 
  23.     } 
  24. } 
  25. $student = new Student(); 
  26. $student->talk(); 
  27. $student->hello(); 

结果输出

我需要学习

hello Person

由结果可知

trait的方法覆盖了基类Person中的方法,所以Person中的方法hello和speak被覆盖

当方法或属性同名时,当前类中的方法会覆盖 trait的方法,所以此处talk会覆盖trait中的talk

3、如果多个Trait中包含同名方法或者属性时,会怎样呢?答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。使用insteadof和as操作符来解决冲突,insteadof是使用某个方法替代另一个,而as是给方法取一个别名

Tags: Traits

分享到: