trait类的使用
trait类的使用
不能被实例化,可以混合到类中去使用。可以将trait看作是类包含的一部分。
多个trait的使用,以及解决冲突问题
insteadof关键字可以解决多个trait类冲突的问题,as可以重新命名,配合insteadof使用可以完美的使用任意一个trait中的方法
代码清单
<?php
/**
* trait类的使用
* User: mali@mali
* Date: 2020/8/3
* Time: 12:04 上午
*/
trait querygoods{
/**
* 查看商品列表
* @author mali
* @date 2020/8/3 12:10 上午
*/
public function getList()
{
echo "查询列表信息 <br/>";
}
/**
* 获取详情
* @author mali
* @date 2020/8/3 12:07 上午
*/
public function getDetail()
{
echo "查看商品详情 <br/>";
}
}
trait categor{
/**
* 分类列表
* @author mali
* @date 2020/8/3 12:11 上午
*/
public function getList()
{
echo "查看分类列表";
}
/**
* 分类详情
* @author mali
* @date 2020/8/3 12:11 上午
*/
public function getGoods()
{
echo "查看分类下的商品";
}
}
class goods{
use querygoods,categor{
categor::getList insteadof querygoods;// 通过insteadof,可以categor::getList覆盖querygoods中的getList的方法
querygoods::getList as goodList;//给categor::getList 起一个别名categor::getList,这样就可以让两个冲突的trait都可以使用
}
}
$shop = new goods();
$shop->getList();//输出 分类列表
$shop->getDetail();//输出 查询列表信息
$shop->goodList();//输出 商品列表
trait使用静态方法
项目中大多数情况对外处理的情况下都使用静态方法,因为他们没有存储实例数据。
abstract class Service{
}
trait PriceUtilites{
private static $taxrate=17;
public static function calculateTax(float $price):float {
return ((self::$taxrate/100)*$price);
}
}
class UtilityService extends Service {
use PriceUtilites;
}
$u = new UtilityService();
print $u::calculateTax(100); // 17
trait访问宿主类的属性
trait可以访问宿主类的属性
abstract class Service{
}
trait PriceUtilites{
private static $taxrate=17;
public static $name="中国";
public static function calculateTax(float $price):float {
return ((self::$taxrate/100)*$price);
}
}
class UtilityService extends Service {
use PriceUtilites;
}
$u = new UtilityService();
print $u::calculateTax(100); // 17
print $u::$name;//访问宿主类的属性 中国
trait定义抽象方法
和普通类一样,当一个类使用trait(有抽象方法),客户端就必须负责实现trait类中的抽象方法。
abstract class Service{
}
trait PriceUtilites{
function calculateTax(float $price):float {
return ((static::getTaxRate()/100)*$price);
}
abstract function getTaxRate():float;
}
class UtilityService extends Service{
use PriceUtilites;//trait中有抽象方法,所以宿主类中必须有次方法
public static function getTaxRate(): float
{
return 17;
}
}
$u = new UtilityService();
print $u->calculateTax(100);
浙公网安备 33010602011771号