如何在 PHP 和 Laravel 中使用 Traits

Laravel

事实上,PHP 作为一门编程语言存在的问题之一,就是你只能使用单继承。这意味着一个类只能从另一个类中继承。例如,可能希望从几个不同的类继承方法,以防止代码重复。在 PHP 5.4 中 一个新的语言特性被添加进来,这就是众所周知的 Traits,它在 Laravel 框架中被广泛使用。

PHP 官方网站给出了 Traits 的定义,如下:

“ Trait 是单继承语言(如 PHP )中的一种代码复用机制。 Trait 的目的是减少单继承语言的一些限制,能让开发者自由的重用在不同的类层次结构下几个独立类中的方法。 Trait 的语义组合与类的定义在某种程度上减少了代码的复杂度,避免了与多继承和 Mixins 相关的一些典型问题。

Trait 与类非常相似,但它的目的仅仅是用更好、一致的方式汇聚一些方法。 Trait 本身不能被实例化。除了传统继承之外,它能水平组合行为,换言之,类的应用程序不需要继承。”

PHP Traits是什么?

Trait 是一组简单的包含在另一个类中的方法。 Trait 就像一个抽象类一样,无法单独实例化。

一个 Trait 示例就像下面这样:

trait SharePost {

  public function share($item)
  {
    return 'share this post';
  }

}

然后,您可以在其他类中这样使用 Trait :

class Post {

  use SharePost;

}

class Comment {

  use SharePost;

}

现在,如果您要从这些类中创建新对象,您会发现它们都可以使用 share()方法:

$post = new Post;
echo $post->share(''); // 'share this post' 

$comment = new Comment;
echo $comment->share(''); // 'share this post'

Traits 如何工作 ?

从上面例子可以看到, 尽管 Post 和  Comment 本身没有定义方法,但是他们可以调用  share() 方法。 

Trait 是运行时 「复制和粘贴」 代码的一种方式.

这意味着 Trait 被复制到  Post and Comment ,因此当你实例化一个新实例, 可以直接调用 share() 方法。

我会定期检查我的代码以及如何构造新代码,目的是为了将来可以快速构建新功能,并且可以轻松的开启新项目。

那么,怎样在laravel中使用traits呢?

首先我在项目的Http 目录下创建一个Traits文件夹,并且新建了一个名叫 BrandsTrait.php 的Trait文件

使用它就像这样:

use App\Http\Traits\BrandsTrait;

class YourController extends Controller {
        use BrandsTrait;

        public function addProduct() {
            $brands = $this->brandsAll();
        }
}

这是我的 BrandsTrait.php

<?php
namespace App\Http\Traits;

use App\Brand;
trait BrandsTrait {
    public function brandsAll() {
        // 从品牌表中获取所有品牌.
        $brands = Brand::all();

        return $brands;
    }
}

甚至, 如果您在模型中找到另一种与产品和品牌相互作用有关的通用方法,那么将代码写在该 trait 是个不错的选择。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://medium.com/@kshitij206/traits-in...

译文地址:https://learnku.com/laravel/t/36211

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 4

像 JavaScript 的高阶组件 :joy:

5年前 评论

traits 类调用; 一般用什么比较 self 还是 $this

5年前 评论
颠倒的玉石

作者可以举一些实际运用的例子么

5年前 评论
wanghan
trait Singleton
{
    private static $instance;

    static function getInstance(...$args)
    {
        if(!isset(self::$instance))
        {
            self::$instance = new static(...$args);
        }

        return self::$instance;
    }
}

类秒变单例的trait

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!