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);

posted on 2020-08-06 17:54  誓_言  阅读(261)  评论(0)    收藏  举报

导航