💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
trait看上去更像是为了代码的复用而写的一个小插件,它类似于include 可以用use放在类中间,让trait里面定义的方法作为class的一部分 本身不能直接实例化 2.作用域 Trait的作用域在引用该Trait类的内部是都可见的(public、private 等等都可以) 可以理解为use关键字将Trait的实现代码Copy了一份到引用该Trait的类中 3.Trait中属性的优先级 01、来自当前类的成员覆盖了 trait 的方法 02、trait 覆盖了被继承的方法 类成员优先级为:当前类>Trait\>父类 03、trait 中不能使用const 04、trait 中定义了属性,使用插件的类不能存在相同的属性,不能会报错 ``` <?php class Question { public function publicF() { echo __METHOD__ . ' public function' . PHP_EOL; } protected function protectF() { echo __METHOD__ . ' protected function' . PHP_EOL; } } trait Log { public function startLog() { echo __METHOD__ . ' public function' . PHP_EOL; } protected function endLog() { echo __METHOD__ . ' protected function' . PHP_EOL; } } trait Check { public function parameterCheck($parameters) { echo __METHOD__ . ' = '.$parameters . PHP_EOL; } } class Publish extends Question { use Log,Check; public function doPublish($para) { $this->startLog(); $this->parameterCheck($para); $this->endLog(); } } $publish = new Publish(); $publish->doPublish("xiaoliu"); 结果 Log::startLog public function Check::parameterCheck = xiaoliu Log::endLog protected function ``` 5. trait 不能实现接口 Trait也可以互相组合,还可以使用抽象方法,静态属性,静态方法等 ``` trait Cat{ public function eat(){ echo "This is Cat eat"; } } trait Dog{ use Cat; public function drive(){ echo "This is Dog drive"; } abstract public function getName(); public function test(){ static $num=0; $num++; echo $num; } public static function say(){ echo "This is Dog say"; } } ```