前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP 代码复用机制 trait

PHP 代码复用机制 trait

作者头像
很酷的站长
发布2022-12-16 21:32:44
5540
发布2022-12-16 21:32:44
举报
文章被收录于专栏:站长的编程笔记
1. trait 的介绍

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

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

2. trait 的基础用法

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

代码语言:javascript
复制
// 定义一个 trait
trait Say
{
    // 在 trait 中不能定义常量
    // 报错提示:Traits cannot have constants
    // const PI = 3.14; // 错误示例
    // 属性
    public static $name = 'liang';
    // 方法
    public static function hello()
    {
        echo 'Hello World !';
    }
}
class User
{
    use Say; // 在类中引入 trait
}
// 测试输出
echo User::$name;
echo User::hello();
3. trait 的优先级

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

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

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

代码语言:javascript
复制
当前类成员 > trait 成员 > 继承的成员
4. trait 的 as 用法

代码语言:javascript
复制
trait User
{
protected function hello()
{
echo 'user hello';
}
}
class Person
{
use User {
# 起别名
hello as helloNewName;
# 起别名并且修改方法的访问控制
hello as public helloNewName;
}
}
$o = new Person;
$o->helloNewName(); // user hello
5. 引入多个 trait 时的成员同名问题

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

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

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

代码语言:javascript
复制
trait User
{
public function hello()
{
echo 'user hello <br>';
}
}
trait Admin
{
public function hello()
{
echo 'admin hello <br>';
}
}
class Person
{
use User, Admin {
// 指定 hello 方法应用哪个 trait 上的
Admin::hello insteadof User;
// User 上的 hello 想要使用的话就定义个别名,不想使用可以不定义别名
User::hello as helloUser;
}
}
$o = new Person;
$o->hello();
$o->helloUser();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. trait 的介绍
  • 2. trait 的基础用法
  • 3. trait 的优先级
  • 4. trait 的 as 用法
  • 5. 引入多个 trait 时的成员同名问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档