博客列表 >5.6 什么时Trait --33Day

5.6 什么时Trait --33Day

小丑的博客
小丑的博客原创
2018年05月09日 21:19:25701浏览

PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法。php的Traits和Go语言的组合功能类似,通过在类中使用use关键字声明要组合的Trait名称,而具体某个Trait的声明使用trait关键词,Trait不能直接实例化。

实例

<?php
trait Drive{
    public $carName = 'trait';
    public function driving(){
        echo "driving {$this->carName}";
    }
    
}

class Person{
    
    public function eat(){
        echo "eat\n";
    }
    
}

class Student extends Person{
    use Drive;
    
    public function study(){
        echo "study\n";
    }
}
$student = new Student();
    $student->study();
    $student->eat();
    $student->driving();

运行实例 »

点击 "运行实例" 按钮查看在线实例

输出结果如下:

study
eat
driving trait

上面的例子中,Student类通过继承Person,有了eat方法,通过组合Drive,有了driving方法和属性carName。

如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?

实例

<?php 
    trait Drive {
        public function hello() {
            echo "hello drive\n";
        }
        public function driving() {
            echo "driving from drive\n";
        }
    }
    class Person {
        public function hello() {
            echo "hello person\n";
        }
        public function driving() {
            echo "driving from person\n";
        }
    }
    class Student extends Person {
        use Drive;
        public function hello() {
            echo "hello student\n";
        }
    }
    $student = new Student();
    $student->hello();
    $student->driving();

运行实例 »

点击 "运行实例" 按钮查看在线实例

输出结果如下:

hello student
driving from drive

因此得出结论:当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。


上一条:从离职以后下一条:0507作业
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议