【问题标题】:How can I have my trait extend a class我怎样才能让我的特质扩展一个类
【发布时间】:2018-03-16 06:05:18
【问题描述】:

我知道根据定义,特征不能扩展类,但是我想知道是否有某种解决方法。

我的情况:

我创建了包revisionable,它的第一个化身是一个你从你的模型扩展而来的类,它本身扩展了 Laravels 基础 Eloquent 类,但是随着时间的推移,有很多人要求将它变成一个特征,所以人们可以use 修改,并且能够扩展自己的基类。

目前,我能想到的唯一同时允许可扩展类和特征的方法是将两者作为一个整体文件提供,这意味着我在两个文件中重复整个代码,这很容易导致麻烦在路上。

我想知道是否有人知道一些解决方案,我可以拥有一个是上帝的文件,而另一个文件依赖它。

规则

  • 现有类不能使用特征,因为 php 5.3 上包的现有用户将无法访问特征。

【问题讨论】:

  • 我很好奇,你为什么用php 5.3,为什么不升级?

标签: php laravel revisionable


【解决方案1】:

绝对没有办法实现你想要的。


由于 Laravel 本身(在 4.2 中)现在已经放弃 PHP 5.3,是时候继续前进了。

标记一个删除该类的新版本,将 PHP 5.4 要求添加到您的 composer.josn 文件中,并将此信息添加到您的文档中。

仍然坚持使用 5.3 的任何人都可以随时 composer require 您以前的版本。

【讨论】:

    【解决方案2】:

    PHP 5.3 是个问题。 回到它流行的时候,编程风格就是将文件包含/要求到另一个文件中。如果您可以将您的功能拆分为可能包含在特征和类中的功能 - 它可能是一个解决方案。但这取决于功能。

    现代方式是解耦和依赖注入,换句话说就是考虑单元和单元测试。

    trait 的问题以及子类的问题是,如果不触及父类的功能,就无法对所做的纯功能进行单元测试。你不能模拟父类,你只能模拟注入的类,对吧?

    认为现代。创建一个类,在那里注入 Eloquent 对象。然后在特征中使用这个类,并为 laravel 模型使用一些父类。

    请原谅泰勒,你不能嘲笑 Eloquent。他也许可以在新版本的 Laravel 中修复它。但是你必须迁移到 PHP7,因为它是最新 laravel 版本的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 2016-04-22
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多