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

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是给方法取一个别名