首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP中Trait知识点总结

PHP中Trait知识点总结

原创
作者头像
俗可耐
发布于 2018-07-27 06:29:46
发布于 2018-07-27 06:29:46
1.1K0
举报
文章被收录于专栏:俗人笔记俗人笔记

知识点说明

  1. 使用关键字Trait进行定义一个trait;
  2. 类中使用use关键字进行引用trait,引用多个trait,使用逗号进行分隔;
  3. 优先级:当前类 > Trait > 父类;
  4. 解决冲突。使用instead of来指定使用哪个类的哪个方法,或者使用as来为冲突的方法重命名,见下面示例1;
  5. 可以使用as来修改方法的访问控制;
  6. trait组合:在trait中use其他的trait;
  7. Trait支持定义抽象成员;
  8. Trait支持定义静态成员,但是对不同的类,其静态值相互隔离;
  9. 属性冲突:Trait 定义了一个属性后,类就不能定义同样名称的属性,否则会产生 fatal error。 有种情况例外:属性是兼容的(同样的访问可见度、初始默认值)。 在 PHP 7.0 之前,属性是兼容的,则会有 E_STRICT 的提醒。

Trait和Interface的区别

Interface中只有方法的定义,没有实现。

重点

  1. Trait中魔术变量__CLASS__的值是usetrait的类名,而不是调用trait中方法的类。例:父类中进行use,在子类的实例中进行调用trait的方法,__CLASS__的值是父类的类名。
  2. 对于关键字use,引用trait时,如果省略初始\,则表示是相对当前namespace的相对路径;在引入类时,省略初始\则表示引入根命名空间下的类。
  3. 根据__CLASS__的特性,可以实现单例的trait。见下面示例2

示例

示例1 - 解决方法冲突
代码语言:txt
AI代码解释
复制
<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }
    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}
示例2 - 实现单例Trait
代码语言:txt
AI代码解释
复制
trait singleton {    
    /**
     * private construct, generally defined by using class
     */
    //private function __construct() {}
    
    public static function getInstance() {
        static $_instance = NULL;
        $class = __CLASS__;
        return $_instance ?: $_instance = new $class;
    }
    
    public function __clone() {
        trigger_error('Cloning '.__CLASS__.' is not allowed.',E_USER_ERROR);
    }
    
    public function __wakeup() {
        trigger_error('Unserializing '.__CLASS__.' is not allowed.',E_USER_ERROR);
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP面向对象基础总结
近来参加了几场PHP工程师的面试,但是笔试题答得都不理想,回来总结了一下失败的原因,是没看PHP手册。几家公司的PHP基础面试题都可以在PHP手册上找到。哎,现在才知道最好的面试宝典是PHP手册。
用户7657330
2020/08/14
1.6K0
php关键字-trait
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
仙士可
2019/12/18
6020
trait能力在PHP中的使用
相信大家对trait已经不陌生了,早在5.4时,trait就已经出现在了PHP的新特性中。当然,本身trait也是特性的意思,但这个特性的主要能力就是为了代码的复用。
硬核项目经理
2020/03/12
2.7K0
PHP 5.3向更高版本迁移之新特性
需要注意的是,trait的继承顺序: 来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法 当多个trait被同一个类使用的时候,会出现方法冲突的情况,使用关键词insteadof解决 示例代码:
luxixing
2019/05/30
6390
PHP错误异常处理详解
异常处理(又称为错误处理)功能提供了处理程序运行时出现的错误或异常情况的方法。
黄规速
2022/04/14
2.3K0
通过 Trait 水平扩展 PHP 类功能
从 PHP 5.4 开始,引入了一种新的代码复用方式 —— Trait,Trait 其实也是一种通过组合水平扩展类功能的机制,我们在 php_learning/oop 目录下新建一个 trait.php 来存放本篇教程的代码,然后基于 Trait 定义动力源,Trait 结构通过关键字 trait 定义:
学院君
2020/07/21
1.3K0
通过 Trait 水平扩展 PHP 类功能
PHP 代码复用机制 trait
众所周知,PHP 是单继承的语言,也就是 PHP 中的类只能继承一个父类,无法同时从多个基类中继承属性和方法,于是 PHP 实现了一种代码复用的方法,称之为 trait,使开发人员可以在不同层次结构内独立的类中复用属性和方法
很酷的站长
2022/12/16
6250
PHP 代码复用机制 trait
PHP类与对象
将对象实例赋值给一个新变量时,新变量访问的是同一实例。要创建一个新实例必须使用克隆操作
码一
2022/06/03
1.8K0
PHP类与对象
PHP核心技术与最佳实践 读书笔记 第一章面向对象思想的核心概念
面向对象程序设计是一种程序设计范型,同时也是一种程序开发方法。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性,灵活性和可扩展性。
lilugirl
2019/05/26
1.2K0
PHP中的Trait类详解
Class cDemo { public function cfun() { return __METHOD__; } } 定义两个Trait类:
超级小可爱
2023/02/20
7910
php Trait 基础应用讲解
首先,上手册:自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。
1_bit
2021/01/14
4780
PHP-trait(原型)
trait 为了减少单继承语言的限制,可以在不同层次结构内独立的类中复用类的方法集。
cwl_java
2022/11/30
2580
萧峰与郭靖教你学会PHP的Trait
自PHP5.4之前,PHP面向对象需要复用代码的方式是使用类的继承。但PHP只支持单继承,在应对较复杂的业务逻辑中,单继承就显得捉襟见肘了。 trait的使用场景 如以下应用场景: class Person { public function eat() { echo "我是人,我能吃饭<br />"; } } class GuoJing extends Person { public function kungfu() { echo "降龙十八掌!
章鱼喵
2018/06/27
5391
PHP面向对象核心(二)——继承、多态、接口
PHP面向对象核心(二) (原创内容,转载请注明来源,谢谢) 三、继承与多态 3.1 继承 1、继承是类级别的复用,关键词为extends;多态是方法级别的复用。 2、类的组合:一个类作为另一个类的属性;类的继承:子类继承父类的全部内容。 3、范围解析运算符(::) 当子类需要调用父类的方法或者属性时使用此运算符; 当调用类常量和静态方法时使用此符号调用。 4、决定采用组合还是继承,目标是低耦合,即使模块之间尽量独立。 继承扩展简单,但破坏封装,且紧耦合;组合缺点是代码量大。 5、当类不是设计用于继承的,可
用户1327360
2018/03/07
9920
PHP面向对象核心(二)——继承、多态、接口
PHP7-2: 面向对象开发
以上是PHP7的 基础语法,通过本章的学习,可以对PHP有大体的认识。本章有的语法没有介绍到,学习过其他语言的话,很快会上手的。
程序员海军
2021/10/11
5990
PHP7-2: 面向对象开发
PHP 常用设计模式 (转载)
单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
lin_zone
2018/08/15
4830
PHP 常用设计模式  (转载)
php里面traits技术上部(系列篇)
traits技术的基本使用技巧是:他是作用的引入一段《《《代码》》》。 效果图:
贵哥的编程之路
2022/03/25
3710
php里面traits技术上部(系列篇)
php面试之面向对象的相关知识(上篇)
面向对象分上下篇,这里上篇涉及到的内容有:一、面向对象与面向过程有什么区别?  二、面向对象有什么特征?   三、什么是构造函数和析构函数?   四、面向对象的作用域范围有哪几种?   五、PHP 中魔术方法有哪些?
友儿
2022/09/11
9500
相关推荐
PHP面向对象基础总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档