我如何让我的trait扩展一个类


How can I have my trait extend a class

我明白,根据定义,一个trait不能扩展一个类,但我想知道是否有某种解决办法。

我的情况:

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

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

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

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

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


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

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

任何人仍然停留在5.3可以随时只是composer require你以前的版本

Php 5.3是一个问题。当它流行的时候,编程风格都是关于包含/要求文件到另一个文件。如果你能把你的功能分成可以包含在trait和类中的函数——这可能是一个解决方案。但这取决于功能。

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

trait的问题和子类的问题是,你不能在不触及父类功能的情况下对你所做的事情的纯功能进行单元测试。你不能模拟父类,你只能模拟注入类,对吧?

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

原谅泰勒,你不能嘲笑雄辩者。他也许能够在新版本的Laravel中修复这个问题。但是你必须转到PHP7,因为它是最新的laravel版本的要求。