资讯专栏INFORMATION COLUMN

简述我所理解的 PHP Trait

gecko23 / 1171人阅读

摘要:和组合的语义定义了一种减少复杂性的方式,避免传统多继承和类相关典型问题。队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短请求和相应的时间。同样的道理,根据引入不同的来完成对应的功能。

Trait 概念

在常规的 PHP 开发中,我们都习惯于先编写一个通用的基类,实现基本的功能,然后扩展这个基类,创建更具体的子类,直接从父类继承实现。很多编程语言都使用这个继承层次结构模式。大多数时候这种典型的继承模型能够良好运作,但是如果想让两个无关的PHP 类具有类似的行为,而不是采用继承的模式,应该怎么做呢?

Trait 就是为了解决这种问题而诞生的。Trait能够把模块化的实现方式注入多个无关的类中,从而提高代码复用,符合 DRY(Don’t Repeat Yourself)原则。

自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait。

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

Trait 简单的来说,就是将一些通用的,可重复的方法独立出去,拆分成为可复用的组件,最后只要在需要的地方 use 组件,所有代码以【插件】的形式引入,这样的代码可读性更高。

如何将一个完整的代码进行拆分,分解出一些可复用的组件,就是我们实际写代码的场景决定了。如 Laravel 队列。

Laravel 队列

Laravel 队列为不同的后台队列服务提供统一的 API , 例如 Beanstalk,Amazon SQS, Redis,甚至其他基于关系型数据库的队列。 队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短Web请求和相应的时间。

队列配置文件存放在 config/queue.php。 每一种队列驱动的配置都可以在该文件中找到, 包括数据库, Beanstalkd, Amazon SQS, Redis, 以及同步(本地使用)驱动。 其中还包含了一个 null 队列驱动用于那些放弃队列的任务

创建 Laravel 队列也很简单,只需要在 Jobs 目录下创建类,集成 ShouldQueue 接口即可,如:

message = $message;
    }

    public function handle() {
        $options = [
            "tag" => "wechat",
            "text" => $this->message
        ];

        $this->sendRequest("url", $options, "", "POST");
    }
}

其它的根据需要,通过引入 Trait 即可,如上述代码的三个 Trait: InteractsWithQueue, Queueable, SerializesModels,每个 Trait 各司其职:

getProperties();

        foreach ($properties as $property) {
            $property->setValue($this, $this->getSerializedPropertyValue(
                $this->getPropertyValue($property)
            ));
        }

        return array_map(function ($p) {
            return $p->getName();
        }, $properties);
    }

    /**
     * Restore the model after serialization.
     *
     * @return void
     */
    public function __wakeup()
    {
        foreach ((new ReflectionClass($this))->getProperties() as $property) {
            $property->setValue($this, $this->getRestoredPropertyValue(
                $this->getPropertyValue($property)
            ));
        }
    }

    /**
     * Get the property value for the given property.
     *
     * @param  ReflectionProperty  $property
     * @return mixed
     */
    protected function getPropertyValue(ReflectionProperty $property)
    {
        $property->setAccessible(true);

        return $property->getValue($this);
    }
}

这个 SerializesModels Trait 的主要作用是,如果你的消息队列的构造器中接收了 Eloguent 模型,那么就可识别出该模型的属性会被序列化到队列里。当任务被实际运行时,队列系统便会自动从数据库中重新取回完整的模型。这整个过程对这个任务类来说,完全透明,根本上就不用去关心和 Eloguent 模型序列化和反序列化的问题。如果任务队列中,如果不需要引入 Eloquent 模型,可以不需要 use SerializesModels。

同样的道理,根据引入不同的 Trait 来完成对应的功能。

总结

Laravel 框架大量使用了 traits。只要有心观察,还是能看出这种写法所带来的好处,和代码的可扩展性。

参考

http://php.net/manual/zh/language.oop5.traits.php

http://d.laravel-china.org/docs/5.4/queues


听说最美的人和最帅的人,都会给作者打赏,以资鼓励


coding01 期待您关注

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

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

相关文章

  • PHP5.3、5.4、5.5、5.6各版本重要更新简述

    摘要:今天无事,偶尔看到中的版本选择处有关于各版本的区别的简短描述,于是总结一下。相对于之前版本,最大区别也就是命名空间和匿名函数了,这在平时开发和各大框架中都用的比较多了,就不再详述了。的主要更新是数组简写语法格式和了。 今天无事,偶尔看到phpstorm中的版本选择处有关于各版本的区别的简短描述,于是总结一下。 showImg(https://segmentfault.com/img/b...

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

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

    kidsamong 评论0 收藏0
  • 2017 我所分享技术文章总结(下)

    摘要:对下半年所分享的文章进行整理,上半年总结的篇好文请点击这里,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。 对下半年所分享的文章进行整理,上半年总结的 98 篇好文请点击这里,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可...

    XBaron 评论0 收藏0
  • php 代码复用机制--traits

    摘要:是一种为类似的单继承语言而准备的代码复用机制。因为中的变量环境是基于函数的,所以会输出博客链接代码复用机制,本文后续如有更新将会在博客更新。 提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比如依赖父类、耦合性太大、破坏了类的封装性。那么有没有更好的方法来实现代码复用呢? 自 PHP 5.4.0 起,PHP 实现了另外...

    yedf 评论0 收藏0
  • PHPTrait详解及其应用

    摘要:很明显这违背了原则。而方式则避免了上述的不足之处相对优雅的实现了代码的复用。中属性的优先级说到优先级就必须要有一个对比的参照物这里的参照对象时引用的类及其父类。其他介绍的的文章如何使用文章首发在中详解及其应用 从PHP的5.4.0版本开始,PHP提供了一种全新的代码复用的概念,那就是Trait。Trait其字面意思是特性、特点,我们可以理解为,使用Trait关键字,可以为PHP中的类添...

    Blackjun 评论0 收藏0

发表评论

0条评论

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