思考:php中继承是单继承,如果某个类有成员要被其他类使用,就需要称为其他类的父类才行,这样可能会导致继承链会长,合适吗?
引入:哦那个继承的角度触发,继承链可以解决问题,但是的确效率会打折扣,同时,如果某些功能是共性使用,但是并不符合继承条件(不属于同一类)
那么使用继承也有所违背面上对象规则,此时可以使用php提供的另外一种代码复用技术trait
trait代码复用【掌握】
定义:trait是为类似php的单继承语言而准备的一种代码复用机制,trait可以使得但继承语言为了复用而不得不继承的尴尬,让面向对象更加纯粹
1.trait是一种类似class的关键字
<?php // 定义trait trait show{ }
2.trait内部可以像类一样拥有成员属性(包含静态),成员方法(包含静态),但不能有常量
<?php // 定义trait trait show{ public $name; protected $host; //允许定义,但实际不用 private $info; public function show_time(){ echo $this->info; } protected function showhost(){ //允许定义,但实际不用 echo $this->name; } const pi=3.1415926; //错误 trait中不能有常量 }
3.trait是用来实现代码的复用的,不可以被实例化也不可以被继承
<?php // 定义trait trait show{ public $name; protected $host; //允许定义,但实际不用 private $info; public function show_time(){ echo $this->info; } protected function showhost(){ //允许定义,但实际不用 echo $this->name; } } new show(); //trait 不允许被实例化
4.trait是用来将公共代码提供给其他类使用的,而类要使用trait的掐你是加载对应的trait
<?php // 定义trait trait Show{ public $name="d"; public function show_time(){ echo $this->name; } } //类中加载trait class add{ //加载:使用use关键字 use Show; //use 就表示将trait show中所有的东西拿到了当前类add中 } //使用trait中的内容 $s=new add(); $s->show_time(); //show add类中自己没有show_time方法,但是因为使用了trait show 所以可用
5.一个类可以使用多个trait
<?php // 定义trait trait Show{ public $name="d"; public function show_time(){ echo $this->name; } } trait get{ public $age=18; public function get_age(){ echo $this->age; } } //类中加载trait class add{ //加载:使用use关键字 use Show; //use 就表示将trait show中所有的东西拿到了当前类add中 use get; } //使用trait中的内容 $s=new add(); $s->show_time(); //show add类中自己没有show_time方法,但是因为使用了trait show 所以可用 $s->get_age();