前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP中Trait知识点总结

PHP中Trait知识点总结

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

知识点说明

  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
复制
<?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
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 知识点说明
  • Trait和Interface的区别
  • 重点
  • 示例
    • 示例1 - 解决方法冲突
      • 示例2 - 实现单例Trait
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档