php 自动加载和trait 语法糖

#文件地址:/my/cats.php
namespace my;
trait cats{
    public $name = 'TOM';
    public static function color(){
        echo "白色";
    }
    public function scratch(){
        echo "你被挠伤了!<br />";
    }
}
#文件地址:/my/dogs.php
namespace my;
class dogs{
   #性状的使用方法,直接写下面语句就可以直接用了,非常方便(需要加载类文件)
   use cats;
   //public $name = 'JHON';
   #注意这块有个坑,如果用构造函数定义一个用public方法相同的属性会报如下错误。
   # Fatal error: my\dogs and my\cats define the same property ($name) in the composition of my\dogs.
   function __construct($name='JHON'){
        if(!empty($name)){
            $this->name = $name;
        }
        echo $this->name.'热情的跑过来<br />';
    }
    public static function color(){
        echo '灰色<br />';
    }
    public function bite(){
        echo '你被咬伤了!<br />';
    }
    public function catScratch()
    {
        $this->scratch();
    }

    function __destruct(){
        echo $this->name."逃跑了<br />";
    }
}
#命名空间:如果有下列语句,代码中可声明类可直接用 new 类名() 实例化,如果没有,就需要使用 new 命名空间\类名声明
use my\dogs;

#自动加载注册函数
function loadDo($className){
    $path = str_replace('\\', '/', __DIR__ . '\\'. $className).'.php';
    if(is_file($path)) {
        require $path;
    }else{
        echo '文件不存在!';
    }
}

#系统默认自动加载函数
function __autoload($className){
    loadDo($className);
}

#自动加载函数
spl_autoload_register(loadDo);

#实例化类
#当前类以及使用trait语法糖加载cats类
$dog = new dogs();

#这个方法是cats类中定义的,可以直接调用
$dog->scratch();

#这是原始类中自定义的方法,原始类中调用trait类,跟自有函数的调用方法一样,属性也一样。
$dog->catScratch();

#如果原始类和trait类中的有相同属性或方法会优先使用原始类中的属性或方法
echo $dog->name.'<br />';

#静态方法也是
my\dogs::color();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值