我的课程名为Controller_Home
。它应该继承自Controller_Permissions
和Controller_Template
。任何以Controller_
为前缀的类都必须从Controller
类继承。
如果PHP支持多重继承(我的情况),我可以这样做:
class Controller_Home extends Controller_Permissions, Controller_Template {
Controller_Permissions
,Controller_Template
:
Controller_Permissions extends Controller {
Controller_Template extends Controller {
现在我需要做这样的事情:
class Controller_Home extends Controller_Template {
class Controller_Permissions extends Controller_Template {
Controller_Template extends Controller {
好的,它有效!
现在我需要使用没有权限的Controller_Template
(在Controller_Permissions
中)。
如何在不重复代码的情况下执行此操作?我不想要另一个班级Controller_TemplateWithoutPermissions
。
控制器,模板和权限就是例如。
答案 0 :(得分:12)
多重继承的常见替代方法是使用合成。这使得这种关系成为“有一个”,而不是一个“是一个”的关系。即在上面的示例中,您可能将ControllerHome从ControllerTemplate继承,但将一些ControllerPermissions作为变量。这样ControllerHome 是 ControllerTemplate,有 ControllerPermissions。
答案 1 :(得分:3)
在这种情况下你可以使用Traits。
Traits与mixins类似,但mixins只能使用继承操作组合,traits提供更广泛的操作选择,包括对称和,方法排除和别名。 Trait与抽象类型的不同之处在于它提供了其方法的实现,而不仅仅是类型签名。
答案 2 :(得分:3)
根本没什么可说的。你的所有课程紧密结合在一起。定义,然后在对象上实现接口,并使用聚合来构建“具有权限”和“无权限”类型是一种更清晰,更“漂亮”的解决方案。它还允许IoC(如果你是一个坚定的SOLID人员,它会破坏封装),这可以为你提供更好的单元测试场景,并允许使用DI容器。