作用:PHP中使用trait关键字是为了解决一个类既想集成基类的属性和方法,又想拥有别的基类的方法,而trait一般情况下是和use搭配使用的。trait就是解决了继承只能继承一个的缺陷  实例:

<?phptrait Drive {public $carName = 'trait';public function driving() {echo "driving {$this->carName}\n";}}class Person {public function eat() {echo "eat\n";}}class Student extends Person {use Drive;public function study() {echo "study\n";}}$student = new Student();$student->study();$student->eat();$student->driving();//www.jb51.net/article/114247.htm?>
study
eat
driving traitStudent类通过继承Person,有了eat方法,通过组合Drive,有了driving方法和属性carName。
如果Trait、基类和本类中都存在某个同名的属性或者方法,最终会保留哪一个呢?

结论当方法或属性同名时,当前类中的方法会覆盖trait方法,而 trait 的方法又覆盖了基类中的方法。

<?php trait Drive {public function hello() {echo "hello drive\n";}public function driving() {echo "driving from drive\n";}}class Person {public function hello() {echo "hello person\n";}public function driving() {echo "driving from person\n";}}class Student extends Person {use Drive;public function hello() {echo "hello student\n";}}$student = new Student();$student->hello();$student->driving();
?>
hello student
driving from drive
结论当方法或属性同名时,当前类中的方法会覆盖trait方法,而 trait 的方法又覆盖了基类中的方法。

多个trait重名的时候会有fatal error

如果要组合多个Trait,通过逗号分隔 Trait名称:
use Trait1, Trait2;
如果多个Trait中包含同名方法或者属性时,会怎样呢?
答案是当组合的多个Trait包含同名属性或者方法时,需要明确声明解决冲突,否则会产生一个致命错误。
PHP Fatal error:  Trait method hello has not been applied, because there are
collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20<?php
trait Trait1 {public function hello() {echo "Trait1::hello\n";}public function hi() {echo "Trait1::hi\n";}
}
trait Trait2 {public function hello() {echo "Trait2::hello\n";}public function hi() {echo "Trait2::hi\n";}
}
class Class1 {use Trait1, Trait2;
}
?>

使用insteadof和as操作符来解决冲突,

使用insteadof和as操作符来解决冲突,
insteadof是使用某个方法替代另一个,而as是给方法取一个别名,具体用法请看代码<?php
trait Trait1 {public function hello() {echo "Trait1::hello\n";}public function hi() {echo "Trait1::hi\n";}
}
trait Trait2 {public function hello() {echo "Trait2::hello\n";}public function hi() {echo "Trait2::hi\n";}
}
class Class1 {use Trait1, Trait2 {Trait2::hello insteadof Trait1;Trait1::hi insteadof Trait2;}
}
class Class2 {use Trait1, Trait2 {Trait2::hello insteadof Trait1;Trait1::hi insteadof Trait2;Trait2::hi as hei;Trait1::hello as hehe;}
}
$Obj1 = new Class1();
$Obj1->hello();
$Obj1->hi();
echo "\n";
$Obj2 = new Class2();
$Obj2->hello();
$Obj2->hi();
$Obj2->hei();
$Obj2->hehe();
?>Trait2::hello
Trait1::hiTrait2::hello
Trait1::hi
Trait2::hi
Trait1::hello

Trait 也能组合Trait,Trait中支持抽象方法、静态属性及静态方法

as关键词还有另外一个用途,那就是修改方法的访问控制:
Trait 也能组合Trait,Trait中支持抽象方法、静态属性及静态方法,测试代码如下:<?php
trait Hello {public function sayHello() {echo "Hello\n";}
}
trait World {use Hello;public function sayWorld() {echo "World\n";}abstract public function getWorld();public function inc() {static $c = 0;$c = $c + 1;echo "$c\n";}public static function doSomething() {echo "Doing something\n";}
}
class HelloWorld {use World;public function getWorld() {return 'get World';}
}
$Obj = new HelloWorld();
$Obj->sayHello();
$Obj->sayWorld();
echo $Obj->getWorld() . "\n";
HelloWorld::doSomething();
$Obj->inc();
$Obj->inc();
?>Hello
World
get World
Doing something
1
2

https://www.jb51.net/article/114247.htm

PHP魔术常量trait相关推荐

  1. 雷林鹏分享:PHP 魔术常量

    PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的值随着它们 ...

  2. php超全局变量,魔术常量,魔术方法

    整理了下关于php的基础知识,参考了些资料,如下: 超全局变量 超全局变量 - 超全局变量是在全部作用域中始终可用的内置变量: $GLOBALS $GLOBALS - 引用全局作用域中可用的全部变量 ...

  3. PHP的魔术常量魔术方法超全局变量

    1.魔术常量 概念:所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化. __LINE__ 获取文件中的当前行号 __FILE__ 获取文件的完整路径和文件名 __DIR__ 获 ...

  4. PHP中的预定义常量和魔术常量

    魔术常量(8个) 1.__LINE__ 返回文件中的当前行号. 2.__FILE__ 返回文件的完整路径和文件名.如果用在包含文件中,则返回包含文件名.自 PHP 4.0.2 起,__FILE__ 总 ...

  5. 几个 PHP 的“魔术常量”

    几个 PHP 的"魔术常量" __LINE__ 文件中的当前行号. __FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名.自 PHP 4.0.2 起 ...

  6. php --魔术常量 /魔术方法

    魔术常量: 1. __LINE__ 返回文件中的当前行号. 2. __FILE__ 返回所在文件的完整路径.包含文件名 3. __FUNCTION__ 返回所在函数名称. 4. __CLASS__ 返 ...

  7. php中数据类型、数组排序、循环语句、混编、操作本地文件流程、常用API、函数、魔术常量

    php中数据类型: php中有7种数据类型,分别是: //1.String字符串,用引号包裹的字符,如:$str = 'hello word';//2.Integer整型,可以是正数或负数,有十进制. ...

  8. php 魔术函数,PHP魔术函数、魔术常量、预定义常量

    一.魔术函数(13个) 1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__des ...

  9. PHP 魔术常量,__LINE__,__FILE__,__DIR__等等8个常用魔术常量

    PHP 向它运行的任何脚本提供了大量的预定义常量. 不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了. 有八个魔术常量它们的值随着它们 ...

最新文章

  1. 找不到php的版本,php – 在任何版本中都找不到请求的包…
  2. JarvisOJ Basic 熟悉的声音
  3. CF1042D Petya and Array
  4. 建站篇-数据库-修改默认users表
  5. 安装webpack命令环境
  6. Linux实操篇②(远程连接Linux;Xshell 6 和 Xftp 6 工具的安装;Xshell 6 和 Xftp 6 工具的配置和使用;)
  7. PAT Java实现厘米换算英尺英寸
  8. python ttf font weight_使用FontCreator将ttf字体制作多字重字体并打包为Magisk字体模块...
  9. GDSOI 2016 T2 星际穿越
  10. python做视频剪辑_视频自媒体人们,还用什么快剪辑,爱剪辑,几行python搞定一切...
  11. 外贸开发信用什么邮箱好?这个邮箱靓号注册网站不要错过
  12. 苏宁易购获得suning商品详情 API 返回值说明
  13. windows下使用VS2010编译jpeglib
  14. 自考学历和成考学历哪个更高一些 有啥区别
  15. 词频统计之《哈姆雷特》
  16. 什么是好的BIM轻量化引擎
  17. echars大屏开发案例
  18. 官方发布|BSV区块链协会推出全新智能合约转译器
  19. 【论文翻译】Graph Convolution over Pruned Dependency Trees Improves Relation Extraction
  20. 第二部分:二十三种设计模式解读——什么是工厂方法模式

热门文章

  1. lucene和elasticsearch的前世今生、elasticsearch的核心概念、elasticsearch核心概念 vs. 数据库核心概念(来自学习资料)
  2. 什么是HADOOP、产生背景、在大数据、云计算中的位置和关系、国内外HADOOP应用案例介绍、就业方向、生态圈以及各组成部分的简介(学习资料中的文档材料)
  3. Oracle 11g客户端及PLSQL Developer配置|Instant Client Setup-64位|OraClientLite11g_x86
  4. 2Boost之UPD,Client and Server
  5. Linux redhat下安装jdk-6u45-linux-x64.bin
  6. Python AdaBoost提升算法
  7. android 实现定时通知,在Android中创建定时通知(例如,针对事件)
  8. 二分平均值聚类 java_二分K-均值聚类算法
  9. python字符串成熟编码_python字符串转公式两种方法获取网页编码python版
  10. mysql增删改查 dao_MYSQL 之 JDBC(七):增删改查(五) DAO设计模式