资讯专栏INFORMATION COLUMN

PHP 特性之 trait (一)

ermaoL / 3431人阅读

摘要:在阅读文档的时候看到一个类是以声明的。是一种代码复用技术,为的单继承限制提供了一套灵活的代码复用机制。下面把的代码做一个修改以上代码会输出。可以看出优先级的顺序为,当前类的优先级基类。

  在阅读laravel文档的时候看到一个类 是以 Trait声明的。平时在工作中从来没有用过,于是就去看了下官方文档。原来这个类早在php5.4.0就有了。可惜在项目中从来没有用过。

  Trait看上去既像类又像接口,其实都不是,Trait可以看做类的部分实现,可以混入一个或多个现有的PHP类中,其作用有两个:表明类可以做什么;提供模块化实现。Trait是一种代码复用技术,为PHP的单继承限制提供了一套灵活的代码复用机制。

为什么使用Trait

PHP语言使用一种典型的单继承模型,在这种模型中,我们先编写一个通用的根类,实现基本的功能,然后扩展这个根类,创建更具体的子类,直接从父类继承实现。这叫做继承层次结构,很多编程语言都使用这个模式。大多数时候这种典型的继承模型能够良好运作,但是如果想让两个无关的PHP类具有类似的行为,应该怎么做呢?
Trait就是为了解决这种问题而诞生的。Trait能够把模块化的实现方式注入多个无关的类中,从而提高代码复用。

下面看几个简单的例子
简单使用
trait Member
{
    public  function info()
    {
        echo "this is trait";
    }

}

class ShowMember
{
    use Member;
}
$Member = new ShowMember();
$Member->info();

以上代码会输出this is trait,从这里可以看出Trait的使用方法很简单,即使用use关键字。可能你已经注意到,命名空间和Trait使用的都是use关键字,不同之处在于导入位置,命名空间在类的定义体外导入,而Trait在类的定义体内导入。

优先级

当一个类继承的基类,跟使用的Trait有相同的函数名称时,应该是哪一个优先呢,下面我们来看一看。

trait Member
{
    public  function info()
    {
        echo "this is trait";
    }

}

class BaseMember
{

    public function info()
    {
        echo "this is base";
    }

}

class ShowMember extends BaseMember
{
    use Member;
}
$Member = new ShowMember();
$Member->info();

以上代码会输出this is trait。可以看出,当继承的基类与Trait有相同的函数时,Trait的优先级是比基类要高的。下面把Trait的代码做一个修改

trait Member
{
    public  function info()
    {
        parent::info();
        echo "this is trait";
    }

}

class BaseMember
{

    public function info()
    {
        echo "this is base";
    }

}

class ShowMember extends BaseMember
{
    use Member;
}
$Member = new ShowMember();
$Member->info();

以上代码会输出this is basethis is trait。同样可以看出Trait的优先级比基类要高,并且可以再Trait中继承基类的函数。下面再把代码做一个修改。

trait Member
{
    public  function info()
    {
        echo "this is trait";
    }

}

class BaseMember
{

    public function info()
    {
        echo "this is base";
    }

}

class ShowMember extends BaseMember
{
    use Member;
    public function info()
    {
        echo "this is show";
    }
}
$Member = new ShowMember();
$Member->info();

以上代码会输出this is show。可以看出优先级的顺序为,当前类的优先级》Trait》基类。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29375.html

相关文章

  • PHP 特性 trait (二)

    摘要:命名冲突如果使用了多个并且多个中的命名有重复,那么这个时候就会产生一个致命的错误。避免的冲突引起的错误。但是中的属性跟方法,如果需要被外部的类使用的话,必须为,即使是也是不能被外部的类所使用的。 前面我们介绍了Trait的基本使用,下面来介绍下Trait比较复杂的用法 使用多个Trait trait Member { public function info() { ...

    yeooo 评论0 收藏0
  • PHP 5.3向更高版本迁移特性

    摘要:新特性掌握的引入,可以扩展的内容,使在某种形式上实现了多重继承,更加灵活不能被实例化示例代码需要注意的是,的继承顺序来自当前类的成员覆盖了的方法,而则覆盖了被继承的方法当多个被同一个类使用的时候,会出现方法冲突的情况,使用关键词解决示 PHP 5.4新特性 掌握 traits trait的引入,可以扩展class的内容,使class在某种形式上实现了多重继承,更加灵活 t...

    macg0406 评论0 收藏0
  • 关于PHPTrait特性

    摘要:关于作者程序开发人员,不拘泥于语言与技术,目前主要从事和前端开发,使用和,端使用混合式开发。和组合的语义定义了一种减少复杂性的方式,避免传统多继承和类相关典型问题。它为传统继承增加了水平特性的组合也就是说,应用的几个之间不需要继承。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和...

    wind3110991 评论0 收藏0
  • 【日常手记】Laravel5.3

    摘要:个人网站最近刚写了一个手机在线播放的电影站使用日常手记更新使用的的查询作用域的本地作用域去自定义可复用的约束集合,方便链式调用什么是本地查询作用域本地作用域允许我们定义通用的约束集合以便在应用中复用。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和够用是最完美的追求。 个人网站:...

    kidsamong 评论0 收藏0
  • Laravel学习笔记PHP反射(Reflection) (上)

    摘要:说明中经常使用的反射特性来设计代码,本文主要学习的反射特性,来提高写代码时的设计质量。提供一套检测的两个工具包和,类似于探针一样的东西来探测这些一等公民。限于篇幅,下篇再聊下反射。 说明:Laravel中经常使用PHP的反射特性来设计代码,本文主要学习PHP的反射特性,来提高写代码时的设计质量。PHP提供一套检测class, interface, trait, property, me...

    JessYanCoding 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<