【发布时间】:2016-08-23 20:55:53
【问题描述】:
我知道一个抽象类可以有一个我们不想要的层次结构或树,所以我们使用 trait 更像是一种编写重复代码并包含在不同类中的方法。但是如果抽象类也没有层次结构怎么办。
如果我要创建一个只有一些可重用逻辑的类,假设我们不需要多个特征。那么我们应该如何在这两者之间进行选择呢。
抽象类和特征中的方法可以以相同的方式覆盖。所以简而言之,我们可以将这两者相互利用。
例如:
class MyController{
use RestCrudTrait;
public function store(){
//override here
}
}
和
class MyController extends RestCrudController{
public function store(){
//override here
}
}
我已经尝试了它们,它们可以以这种方式互换使用。我也在这里放置了控制器,它可以是模型或其他东西。那么究竟需要如何选择使用 Trait 或扩展类。
如果由于这些层次结构等原因继承不好,那么在继承时总是可以使用 Trait 吗?
所以我想知道的是:
这两者是否只是逻辑上不同,实际上可以做相同的事情并且可以互换使用?
即使它们在逻辑上不同,那么在这两者之间应该如何选择呢?
【问题讨论】:
-
traits 的全部意义在于让你从多个树中继承。如果你不需要它,那么定义 trait 是没有意义的。
-
@rjdown trait 并不代表一棵树,但我认为您想说的是继承不同的功能。但是在像上面的例子一样开始一个类的时候,当我们一开始只有一件事要继承或功能时,那么如何决定是特质还是继承呢?
-
我认为你误读了我所说的。无论哪种方式,特征只是为了帮助(如手册所述)“以细粒度和一致的方式对功能进行分组”。同样,如果您不需要它,请不要使用它。
-
@rjdown 如何判断我是否需要它?我可以使用它,以便我总是可以拥有更多的特质或让其他东西继承的类。这样一来,特质听起来像是简单的选择,但这种心态将导致总是使用或特质。那么什么时候继承呢?
-
如果您正在创建一个类并意识到您需要使用来自两个不同的其他类(具有不同的基类)的功能,那么您将使用一个特征。如果您正在创建一个将使用单个类的功能的类,那么首先考虑您是否需要一个新的。如果你这样做,只需延长。
标签: php oop inheritance traits