Home  >  Article  >  Backend Development  >  Instructions for using Trait in php

Instructions for using Trait in php

无忌哥哥
无忌哥哥Original
2018-06-28 15:17:501291browse

* What is Trait?

* 1. Trait is a code reuse mechanism tailored for single inheritance languages;

* 2. Previously, code could be implemented through functions or classes Reuse;

* 3. Trait can be simply understood as a collection of class methods, working between the parent class and subclass;

* 4. But trait is not limited to methods Collections also support abstraction, static and attributes;

* 5. The current class members will overwrite the trait class members, and the members in the trait can override the class members with the same name

* 6. Important Tip: Trait is not a class and cannot be instantiated. Remember

//Declare the parent class: Person

if (!class_exists('Person')) {
  class Person
    {
        protected $name;
        
        public function __construct($name='小明')
        {
            $this->name = $name;
        }
        
        public function study($course='php')
        {
            return $this->name.'在学习'.$course;
        }
    
        
    }  
}

//Declare the trait class: Course Course

if(!trait_exists('Course')){
    trait Course
    {
        //trait中也可以自己的属性
        public $friend='小华';
        public function sport($name='踢足球')
        {
//            return $this->name.'在学习'.$name;
            //trait中可以访问父类中的属性
            return $this->name.'和'.$this->friend.'在学习'.$name;
        } 
        
        //trait中同样支持抽象,以及静态方法,我放在一起写了
        //我把这个方法声明为抽象的同时,也声明为静态
        abstract public static function hobby($name);
        
        
        //在trait中也声明一个与父类同名的study()方法,参数修改一下以示区别
        public function study($course='java')
        {
            return $this->name.'在学习'.$course;
        }
    }
}


//Declare trait class: Recreation Entertainment

if(!trait_exists('Recreation')){
    trait Recreation
    {
        //这个trait类中也声明一个与Course中同名的方法sport
        //注意: 属性$friend不允许与Course::sport()同名
        //因为目前trait中还没有处理同名属性的机制,期待新版本会解决
        //这里我们将$friend 修改为 $friend1
        public $friend1='小军';
        public function sport($name='打蓝球')
        {
//            return $this->name.'在学习'.$name;
            //trait中可以访问父类中的属性
            return $this->name.'和'.$this->friend1.'在学习'.$name;
        } 
        
        
    }
}

Declare subclass: Student, inherited from parent class: Person

class Student extends Person
{
    //导入trait类
//    use Course;
    
    //子类支持导入多个trait类,但不可避免的会遇到方法重名问题,怎么解决呢?
//    use Course, Recreation;  //同时引入二个trait类
    //如果这二个trait类中有重名方法,要用以下语句结构解决
    use Course, Recreation {
        //访问sport()方法冲突时,使用Course::sport()代替掉Recoreation::sport()
        Course::sport insteadof Recreation;
       
        //再访问Recoreation::sport()时启用别名 mySport()
        Recreation::sport as mySport;
    }
    
    //子类中必须实现trait中声明的抽象方法hobby()
    public static function hobby($name)
    {
        return $name;
    }
    
    //在子类中再声明一个与trait类同名的study()方法,参数修改一下以示区别
    public function study($course='python')
    {
        return $this->name.'在学习'.$course;
    }
    
}


/ /Instantiate the Student class

$student = new Student();

//1. Access the methods in the parent class Person

echo $student->study();
echo &#39;<hr>&#39;;

//2. Access the methods in the trait class

echo $student->sport();
echo &#39;<hr>&#39;;

//3 To call abstract static methods in a trait, you must use Student to access them

echo Student::hobby(&#39;抽烟喝酒烫头&#39;);
echo &#39;<hr>&#39;;

//4. When a trait has a method with the same name as the parent class, the trait priority is higher

echo $student->study();

// 5. When there is a method with the same name as the trait class in a subclass, the subclass has a higher priority

echo $student->study();
echo &#39;<hr>&#39;;

//6. The subclass can obtain method sets from multiple traits

echo $student->sport();
echo &#39;<hr>&#39;;
echo $student->mySport();

The above is the detailed content of Instructions for using Trait in php. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:interface in phpNext article:interface in php