public function aa() { echo "解析:aaa....
"; } public function bb(){ echo "bb...
"; } } abstract class Humanity { public $name; public $sex; public $iq=10; const BIRTHPLACE="地球"; static public $counter=0; public function __construct($name,$sex) { self::$counter++; $this->name=name; $this->sex=$sex; } protected function chew($food) { echo "{$food}已经被咀嚼完成!
"; } abstract public function eat($food); static public function hello() { echo '您好!我是来自'.self::BIRTHPLACE.'的人类
'; } } class Student extends Humanity { const BIRTHPLACE='火星'; public $studentId; public function test($subject) { echo "{$this->name}正在考{$subject}!
"; } public function eat($food) { $this->chew($food); echo "{$this->name}正在快速的吃{$food}!
"; } use tA;//相当于 /*public function aa() { echo "aaa....
"; } public function bb(){ echo "bb...
"; }*/ } abstract class Dog { } class huskies extends Dog { use tA; //相当于 /*public function aa() { echo "aaa....
"; } public function bb(){ echo "bb...
"; }*/ } $hanMM=new Student('韩梅梅','女'); $hanMM->aa(); $wW=new Huskies(); $wW->bb();
use tA;相当于
public function aa() { echo "aaa....
"; } public function bb(){ echo "bb...
"; }
traits技术的基本使用技巧是:他是作用的引入一段《《《代码》》》。
效果图:
public function aa(){ echo "解析:tA:aa...
"; } public function bb(){ echo "tA:bb...
"; } } //抽象类 abstract class Humanity { public $name; public $sex; public $iq=10; const BIRTHPLACE='地球'; static public $counter=0;//静态属性,它是公共的资源和具体的实例没有关系 //构造函数 public function __construct($name,$sex){ self::$counter++; $this->name=$name; $this->sex=$sex; } protected function chew($food){ echo "{$food}已经被咀嚼完成!
"; } //抽象方法 abstract public function eat($food); static public function hello(){ echo '您好!我是来自'.self::BIRTHPLACE.'的人类
'; } public function aa(){ echo "Humanity:aa...
"; } } class Student extends Humanity { const BIRTHPLACE='火星'; public $studentId; public function test($subject){ echo "{$this->name}正在考{$subject}!
"; } public function eat($food){ $this->chew($food); echo "{$this->name}正在快速的吃{$food}!
"; } public function aa(){ echo "Student:aa...
"; } use tA; } abstract class Dog { } class Huskies extends Dog { use tA; } $hanMM=new Student('韩梅梅','女'); $hanMM->aa();
本类定义的优先级比语法糖traits定义的优先级高,为什么呢? 因为有一定的层级关系:
父类里面的同名方法<traits里面的同名方法<本类里面的同名方法
一个文件定义多个语法糖:
public function aa(){ echo "tA:aa...
"; } public function bb(){ echo "tA:bb...
"; } } trait tB { public function cc(){ echo "tB:cc...
"; } public function dd(){ echo "tB:dd...
"; } } //抽象类 abstract class Humanity { public $name; public $sex; public $iq=10; const BIRTHPLACE='地球'; static public $counter=0;//静态属性,它是公共的资源和具体的实例没有关系 //构造函数 public function __construct($name,$sex){ self::$counter++; $this->name=$name; $this->sex=$sex; } protected function chew($food){ echo "{$food}已经被咀嚼完成!
"; } //抽象方法 abstract public function eat($food); static public function hello(){ echo '您好!我是来自'.self::BIRTHPLACE.'的人类
'; } public function aa(){ echo "Humanity:aa...
"; } } class Student extends Humanity { const BIRTHPLACE='火星'; public $studentId; public function test($subject){ echo "{$this->name}正在考{$subject}!
"; } public function eat($food){ $this->chew($food); echo "{$this->name}正在快速的吃{$food}!
"; } public function aa(){ echo "Student:aa...
"; } use tA,tB; } abstract class Dog { } class Huskies extends Dog { use tA; } $hanMM=new Student('韩梅梅','女'); $hanMM->aa();
问题: 一次性使用多个trait,如果不提trait里面有同名的方法怎么解决这个冲突呢?
public function aa(){ echo "tA:aa...
"; } public function bb(){ echo "tA:bb...
"; } public function ok(){ echo "tA:ok...
"; } } trait tB { public function cc(){ echo "tB:cc...
"; } public function dd(){ echo "tB:dd...
"; } public function ok(){ echo "tB:ok...
"; } } //抽象类 abstract class Humanity { public $name; public $sex; public $iq=10; const BIRTHPLACE='地球'; static public $counter=0;//静态属性,它是公共的资源和具体的实例没有关系 //构造函数 public function __construct($name,$sex){ self::$counter++; $this->name=$name; $this->sex=$sex; } protected function chew($food){ echo "{$food}已经被咀嚼完成!
"; } //抽象方法 abstract public function eat($food); static public function hello(){ echo '您好!我是来自'.self::BIRTHPLACE.'的人类
'; } public function aa(){ echo "Humanity:aa...
"; } } class Student extends Humanity { const BIRTHPLACE='火星'; public $studentId; public function test($subject){ echo "{$this->name}正在考{$subject}!
"; } public function eat($food){ $this->chew($food); echo "{$this->name}正在快速的吃{$food}!
"; } public function aa(){ echo "Student:aa...
"; } use tA,tB { tA::ok insteadof tB; tB::ok as okTb; } } abstract class Dog { } class Huskies extends Dog { use tA,tB { tB::ok insteadof tA; } } $hanMM=new Student('韩梅梅','女'); $hanMM->ok(); $hanMM->okTb(); $wW=new Huskies(); $wW->ok();
解析一:
use tA,tB { tA::ok insteadof tB; tB::ok as okTb; }
tA里面的ok方法替换掉tB里面的ok方法,tB里面的ok函数改成okTb函数
解析二:
use tA,tB { tB::ok insteadof tA; }
tB里面的ok方法替换掉tA里面的ok方法