批改状态:合格
老师批语:
主题:
写一个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不是类,是一种机制,支持抽象、静态、属性。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号