+ -

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

时间:2021-01-18

来源:互联网

在手机上看
手机扫描阅读

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

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

<?php

trait Person{

    public $name="person";

    public function talk(){

        echo "我是{$this->name}<br/>";

    }

}

class Teacher{

    public function speak(){

        echo "我能教书<br/>";

    }

}

class Student extends Teacher{

    use Person;

    public function study(){

        echo "我需要学习<br/>";

    }

}

$student = new Student();

$student->talk();

$student->speak();

$student->study();

?>

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

<?php

trait Person{

    public $name="person";

    public function talk(){

        echo "我是{$this->name}<br/>";

    }

     public function hello() {

    echo "hello Person<br/>";

  }

}

class Teacher{

    public function talk(){

        echo "我能教书<br/>";

    }

     public function hello() {

    echo "hello Teacher<br/>";

  }

}

class Student extends Teacher{

    use Person;

    public function talk(){

        echo "我需要学习<br/>";

    }

}

$student = new Student();

$student->talk();

$student->hello();

结果输出

我需要学习

hello Person

由结果可知

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

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

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

以上所述是PHP之认识(二)关于Traits的用法详解,希望对您的学习有所帮助。