Blogger Information
Blog 59
fans 0
comment 1
visits 48210
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Trait实现代码复用,多继承——2018年5月7日作业
白猫警长的博客
Original
652 people have browsed it

实例

<?php 
/**
 * Trait是什么?
 * 1.trait是为单继承语言量身定制的代码复用机制;
 * 2.之前可以通过函数或类来实现代码复用;
 * 3.trait可以简单的理解为一个类方法的集合,工作在父类与子类之间;
 * 4.但是trait不仅仅局限于方法集合,还支持抽象,静态与属性;
 * 5.当前类成员会覆盖trait类成员,而trait中的成员,又可以覆盖同名类成员
 * 6.重要提示:trait不是类,不能实例化,切记切记
 */

if(!class_exists('Person'))
{
	class Person
	{
		protected $name;

		public function __construct($name='王老五')
		{
			$this->name = $name;
		}

		public function study($coure='出差')
		{
			return $this->name .'在外地'.$coure;
		}
	}
}

//创建一个trait类,trait类不能够被实例化,只能够被类调用
//trait类:Coures
if(!trait_exists('Coures'))
{
	trait Coures
	{
		// trait中也可以创建属性
		public $friend = '刘小刚';
		public $coure = '出差';

		public function sport($name = '10天')
		{
			return $this->name .'在外地'. $this->coure .'和'. $this->friend .'应酬'.$name;
		}

		//trait类中同样支持抽象,以及静态方法
        //我把这个方法声明为抽象的同时,也声明为静态
		abstract public static function hobby($name);

		//和Person类同名的方法,trait类会替换掉Person类中的同名方法
		public function study($coure = '途中')
		{
			return $this->friend .'在回国的'. $coure;
		}
	}
}

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

//以上有了父类和trait类,接下来创建一个子类
// Student子类 继承 Person父类 中所有的使用方法
class Student extends Person
{
	// use Coures;	//导入trait类,使用use
	
	 //如果这二个trait类中有重名的方法,要用以下语句结构解决
	 use Coures, Recreation {
        //访问sport()方法冲突时,使用Coures::sport()代替掉Recoreation::sport()
        Coures::sport insteadof Recreation;
       
        //再访问Recoreation::sport()时启用别名 mySport()
        Recreation::sport as mySport;
    }

     //子类中必须实现trait中声明的抽象方法hobby()
	public static function hobby($name)
	{
		return $name;
	}

}


//实例化Student子类,这个类中有很多的方法,并将Student子类函数返回的结果保存在变量$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优先级要高
//如果当子类中存在与trait类同名方法时,子类优先级要高于trait类
echo $student->study();
echo '<hr>';
//5.子类可以从多个trait中获取方法集

echo '获取第一个trait类中的方法:'.$student->sport();
echo '<br>';
echo '获取第二个trait类中的方法:'.$student->mySport();

运行实例 »

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


实例化效果图:

1.png

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