trait和命名空间小结

原创 2018-11-26 13:06:39 189
摘要://trait代码复用,trait工作在父类和子类之间,位于父类与子类之间,优先级高于父类(trait不可乱用,否则会影响项目的完整性)低于子类 //trait和class相似, trait仅仅旨在用细粒度和一致的方式来组合功能。trait无法通过自身来实例化。trait与class之间的继承不需要使用extends继承。 trait Func1 {   &
//trait代码复用,trait工作在父类和子类之间,位于父类与子类之间,优先级高于父类(trait不可乱用,否则会影响项目的完整性)低于子类
//trait和class相似, trait仅仅旨在用细粒度和一致的方式来组合功能。trait无法通过自身来实例化。trait与class之间的继承不需要使用extends继承。
trait Func1
{
    public function drive()
    {
        return '支持屋人驾驶';
    }

    public function care()
    {
        return '请及时充电';
    }

    public function accident()
    {
        return '请拨打交警110电话';
    }
}

trait Func2
{
    public function fuel()
    {
        return '新能源汽车';
    }
    //事故处理
    public function accident()
    {
        return '请不要再车内抽烟';
    }
}

class Auto
{
    public $brand;//品牌
    public $purpose;//用途

    public function __construct($brand, $purpose)
    {
        $this->brand = $brand;
        $this->purpose = $purpose;
    }

    //保养
    public function care()
    {
        return '请到店铺中保养';
    }
}

class Bus extends Auto
{
    //可以继承bus中的成员,也可以导入trait类中的方法
//    use Func1;
//    use Func2;
    //命名冲突解决方案:替换;别名
    use Func1,Func2{
        Func1::accident insteadof Func2;//用Func1中accident的方法替换Func2中的accident方法

        Func2::accident as Func2Acc;
    }


//    public function care()
//    {
//        return '我们是生产商,请到经销商店面保养';
//    }
}

$bus = new Bus('比亚迪', '客运');
echo $bus->brand, '<br>';
echo $bus->purpose, '<br>';
echo $bus->drive(), '<br>';
echo $bus->fuel(), '<br>';
echo $bus->care(), '<br>';
echo $bus->accident(), '<br>';//访问Func1中的accident方法
echo $bus->Func2Acc(), '<br>';//访问Func2中的accident方法






//命名空间。在当前命名空间下可以创建和系统重名的函数。
//在命名空间访问一个函数时,优先在当前命名空间中查找,没有找到,则在全局命名空间中查找。如果当前命名空间有与全局命名空间重名的函数,要是想直接调用全局命名空间中的函数,则需要用全局访问符(即在函数开始用反斜杠)。
//在声明命名空间时,不能将带花括号和不带花括号的命名空间放在一个文件中声明。

//声明one空间
namespace one
{
    echo __NAMESPACE__,'<br>';
    class AA{
        public static function index(){
            echo __METHOD__,'<br>';
        }
    }
    function var_dump($name){
        echo 'hello ', $name ,'<br>';
    }
    $name = 'world';
    var_dump($name);//与系统函数同名时,优先调用当前命名空间中的函数  ==  \one\var_dump($name);
    \var_dump($name);//直接调用全局空间中的函数
    echo '<br>';
}
//声明two空间
namespace two
{
    echo __NAMESPACE__,'<br>';
    class BB{
        public static function index(){
            echo __METHOD__;
        }
    }
    \DD::index();//在子空间中显示调用全局空间中的函数
}
//声明全局空间
namespace
{
    echo __NAMESPACE__,'<br>';
    one\AA::index();echo '<br>';
    two\BB::index();echo '<br>';
    class DD{
        public static function index(){
            echo __METHOD__;
        }
    }
}

//全局空间下可以访问子空间,但是在子空间中不可以直接调用全局空间,需要显示调用


/**
 * 导入命名空间:
 * 非限定名称:适用当前空间成员,类似于当前路径
 * 限定名称:与当前空间关联的空间,类似于相对路径
 * 完全限定名称:导入外部空间,类似于绝对路径
 * 导入空间并不意味着自动加载,需要手动加载或自定义自动加载规则
 **/
use app\user\model\User;
//导入有空间名称的函数库,必须是php5.6+
use function app\user\func_lib\delete as del;


批改老师:韦小宝批改时间:2018-11-26 13:40:32
老师总结:写的很不错!代码完整!总结的也很到位哦!继续加油吧!

发布手记

热门词条