在查看Laravel源代码时,我注意到很多这样的东西:
控制器类:
class Controller extends BaseController
{
use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;
}
其中一个组成特征:
trait AuthorizesRequests {
/**
* Authorize a given action against a set of arguments.
*
* @param mixed $ability
* @param mixed|array $arguments
*
* @return \Illuminate\Auth\Access\Response
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function authorize($ability, $arguments = []) {
list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments);
return app(Gate::class)->authorize($ability, $arguments);
}
// ...
}
我对此有几个问题:
app()
)?我正在考虑在我的代码中使用这种方法来分享我的几个类之间的一些通用功能 - 我正在考虑创建一个ChecksBarcodes
特征,它将与股票信息库和共享一起使用这是一些类似但不相关的产品管理流程类之间的特征,它们都需要检查条形码。
答案 0 :(得分:2)
特征与扩展类相似,但有一些差异
它们与其他语言的mixins类似。我想你可以说它是一种简单的方法来使用DRY principle。
由于traits没有构造函数,因此它们所使用的任何依赖项都需要存在于它们所使用的类上。我认为取决于课程,除了特质之外还有一些不好的设计模式。因此,您必须使用服务定位器来引入依赖关系。
如果您不想使用服务定位器,我建议使用类而不是特性。你可以有一个BarcodeChecker
类,你可以将它注入你想要使用它的类的构造函数中。然后,您将使用$this->checkBarcode()
而不是$this->barcodeChecker->check()
。我认为如果特征需要依赖,这将是一个更好的设计模式。
答案 1 :(得分:1)
使用PHP 5.4引入的特性,通常解决PHP的一个大的问题:单继承。我粗略猜测:如果PHP支持多继承(从多个类继承),就不会有特征。
然而,特性是减少代码重复的好方法,并且为多个类提供相同的功能。