当前位置:首页 > 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. class Teacher{ 
  8.     public function speak(){ 
  9.         echo "我能教书<br/>"
  10.     } 
  11. class Student extends Teacher{ 
  12.     use Person; 
  13.     public function study(){ 
  14.         echo "我需要学习<br/>"
  15.     } 
  16. $student = new Student(); 
  17. $student->talk(); 
  18. $student->speak(); 
  19. $student->study(); 
  20. ?> 

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. class Teacher{ 
  11.     public function talk(){ 
  12.         echo "我能教书<br/>"
  13.     } 
  14.      public function hello() { 
  15.     echo "hello Teacher<br/>"
  16.   } 
  17. class Student extends Teacher{ 
  18.     use Person; 
  19.     public function talk(){ 
  20.         echo "我需要学习<br/>"
  21.     } 
  22. $student = new Student(); 
  23. $student->talk(); 
  24. $student->hello(); 

结果输出

我需要学习

hello Person

由结果可知

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

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

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

Tags: Traits

分享到: