当前位置:首页 > 编程技术 > 正文内容

PHP 代码复用机制 trait

yc8881年前 (2022-12-12)编程技术367

PHP 代码复用机制 trait

1. trait 的介绍


众所周知,PHP 是单继承的语言,也就是 PHP 中的类只能继承一个父类,无法同时从多个基类中继承属性和方法,于是 PHP 实现了一种代码复用的方法,称之为 trait,使开发人员可以在不同层次结构内独立的类中复用属性和方法

trait 不是接口也不是类,不可以被实例化也不可以被继承,只是用来将公共代码(属性和方法)提供给其他类使用的

2. trait 的基础用法


trait 的成员:trait 的成员只能有属性和方法,不能定义类常量

  1. // 定义一个 trait
  2. trait Say
  3. {
  4. // 在 trait 中不能定义常量
  5. // 报错提示:Traits cannot have constants
  6. // const PI = 3.14; // 错误示例
  7. // 属性
  8. public static $name = 'liang';
  9. // 方法
  10. public static function hello()
  11. {
  12. echo 'Hello World !';
  13. }
  14. }
  15. class User
  16. {
  17. use Say; // 在类中引入 trait
  18. }
  19. // 测试输出
  20. echo User::$name;
  21. echo User::hello();

3. trait 的优先级


类成员和 trait 成员同名,属性和方法有不同的处理

如果是属性同名,PHP 直接抛出致命错误,方法同名则会有优先级之分

优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法

  1. 当前类成员 > trait 成员 > 继承的成员

4. trait 的 as 用法


  1. trait User
  2. {
  3. protected function hello()
  4. {
  5. echo 'user hello';
  6. }
  7. }
  8. class Person
  9. {
  10. use User {
  11. # 起别名
  12. hello as helloNewName;
  13. # 起别名并且修改方法的访问控制
  14. hello as public helloNewName;
  15. }
  16. }
  17. $o = new Person;
  18. $o->helloNewName(); // user hello

5. 引入多个 trait 时的成员同名问题


引入多个 trait 时,如果存在成员同名,那么 PHP 会直接抛出致命错误

为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个

也就是需要使用 insteadof 操作符指定使用哪个 trait 中的成员

  1. trait User
  2. {
  3. public function hello()
  4. {
  5. echo 'user hello <br>';
  6. }
  7. }
  8. trait Admin
  9. {
  10. public function hello()
  11. {
  12. echo 'admin hello <br>';
  13. }
  14. }
  15. class Person
  16. {
  17. use User, Admin {
  18. // 指定 hello 方法应用哪个 trait 上的
  19. Admin::hello insteadof User;
  20. // User 上的 hello 想要使用的话就定义个别名,不想使用可以不定义别名
  21. User::hello as helloUser;
  22. }
  23. }
  24. $o = new Person;
  25. $o->hello();
  26. $o->helloUser();

本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10214.html

标签: 软件编程
分享给朋友:

“PHP 代码复用机制 trait” 的相关文章

【说站】laravel实现自定义404页面并给页面传值

【说站】laravel实现自定义404页面并给页面传值

以 laravel5.8 为例,虽然有自带的404页面,但太简单,我们更希望能自定义404页面,将用户留在站点。实现的方式很简单,将自定义的视图文件命名为 404.blade.php,并放到 reso...

【说站】Thymeleaf报错Error resolving template “XXX”

【说站】Thymeleaf报错Error resolving template “XXX”

修改了一下开源项目的目录结构访问突然报错Error resolving template “XXX”可能原因有如下三种:第一种可能:原因:在使用springboot的过程中,如果使用thymeleaf...

【说站】用一句话就可以去除宝塔面板操作上的二次验证

【说站】用一句话就可以去除宝塔面板操作上的二次验证

用过宝塔的朋友应该都会发现,现在宝塔面板有些鸡肋的功能,删除文件、删除数据库、删除站点等操作都需要做计算题!不仅加了几秒的延时等待,还无法跳过!这时候就会有朋友在想,如何去除宝塔面板的二次验证,此篇文...

【说站】Centos8.0如何配置静态IP详解及永久关闭防火墙

【说站】Centos8.0如何配置静态IP详解及永久关闭防火墙

这篇文章主要介绍了详解Centos8 配置静态IP的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来学习一下!1. 查看自己的网关地址点击虚...

【说站】利用Webhook实现Java项目自动化部署

【说站】利用Webhook实现Java项目自动化部署

用webhook就能实现Java项目自动部署,其实原理很简单。费话不多说,直接往下看教程。1. 创建gitee仓库并初始化2. 在linux安装git3. 在宝塔的软件的商店里下载Webhook4....

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

【说站】电脑安装MySQL时出现starting the server失败原因及解决方案

今天在安装MySQL时出现starting the server失败,经过查询分析得出以下结论,记录一下操作步骤。原因分析:如果电脑是第一次安装MySQL,一般不会出现这样的报错。如下图所示。star...