Blogger Information
Blog 15
fans 0
comment 1
visits 10909
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
trait 类方法的使用——5.7日作业
吴明的博客
Original
1063 people have browsed it

Trait

trait 是为单继承语言量身定制的代码复用机制;

可以理解为工作在父类和继承的子类之间的一种代理方法集合

trait 不仅仅局限于方法集合还支持抽象,静态和属性

子类的当前类会覆盖trait类成员,trait中的成员又可以覆盖同名类成员

trait 不是类,不能实例化

实例
header('Content-Type:text/html;charset=utf8');
class Person
    {
        protected $name;
        
        public function __construct($name='小明')
        {
            $this->name = $name;
        }
        
        public function study($course='php')
        {
            return $this->name.'在学习'.$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;
		}
	}
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;
	    } 
    
    
	}

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


//实例化Student类
$student = new Student();

//1.访问父类Person中的方法
echo $student->study();

echo '<hr>';

//2.访问trait类中的方法
echo $student->sport();

echo '<hr>';

//3调用trait中的抽象静态方法,必须要用Student来访问
echo Student::hobby('抽烟喝酒烫头');

echo '<hr>';

//4.当trait中存在与父类同名方法时,trait优先级要高
//echo $student->study();

//5.当子类中存在与trait类同名方法时,子类优先级要高
echo $student->study();

echo '<hr>';

//6.子类可以从多个trait中获取方法集

echo $student->sport();
echo '<hr>';
echo $student->mySport();

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


Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post