主题:
写一个trait实例,实现代码复用。
代码效果:
实例
<?php /* * 使用trait扩展功能 */ //判断类名Car是否存在,不存在则创建Car类(父类) if(!class_exists('People')) { class People { //创建受保护变量$name(私有变量不会被子类继承) protected $name = ''; //使用构造函数__construct()初始化变量$name public function __construct($name='小明') { $this->name = $name; } //创建类方法buy(),参数为$shop public function buy($shop='4S') { return $this->name. '去'. $shop. '店'; } } } //创建第一个trait if(!trait_exists('Car')) { trait Car { private $bmw = '宝马'; public function bmw() { return $this->bmw; } } } //创建第二个trait if(!trait_exists('Fruit')) { trait Fruit { private $apple = '苹果'; public function apple() { return $this->apple; } } } //创建子类Person继承父类People if(!class_exists('Person')) { class Person extends People{ //导入trait(如果方法名称、变量名称有重复冲突需要在这里使用insteadof、as处理) use Car, Fruit; private $fruitShop = ''; public function fruitShop($fruitShop='水果店') { $this->fruitShop = $fruitShop; } public function fruit($fruit='苹果') { //$this->name是继承自父类的属性 return $this->name. '去'. $this->fruitShop. '买'. $fruit; } } } //实例化子类为一个对象 $php = new Person(); //子类调用父类中的方法 echo $php->buy('手机'). '<hr>'; //子类调用trait中的方法 echo $php->bmw(). '<hr>'; //子类调用trait中的方法 echo $php->apple(). '<hr>'; //子类的方法 echo $php->fruit('梨子');
运行实例 »
点击 "运行实例" 按钮查看在线实例
知识点:
Trait无法实例化,必须由子类调用。
尽量不使用$this。
Trait相当于一个类的“类库”。
主要目的是实现代码复用。
优先级:父类 < Trait < 子类
Trait不是类,是一种机制,支持抽象、静态、属性。