Php 类结构可能需要实现组合以模拟多重继承
这是基本前提,我正在为db对象使用活动记录模式,我想我需要一些指导如何组织这些类。以及我如何可能划分我的班级结构。希望我不会解释得太过分。如果组合模式是一条路要走,我可能需要一点点的手来实现它 假设在图腾柱的底部有一个Php 类结构可能需要实现组合以模拟多重继承,php,oop,design-patterns,multiple-inheritance,Php,Oop,Design Patterns,Multiple Inheritance,这是基本前提,我正在为db对象使用活动记录模式,我想我需要一些指导如何组织这些类。以及我如何可能划分我的班级结构。希望我不会解释得太过分。如果组合模式是一条路要走,我可能需要一点点的手来实现它 假设在图腾柱的底部有一个ActiveRecord基类,它处理对象到db和db到对象的映射 ActiveRecord的子类是一种通用的User类,处理用户会话、登录、保存时密码字段的加密等 ActiveRecord的另一个子类是ActiveRecord,但稍微高级一些。通常这个类与用户无关,但我的问题是 我
ActiveRecord
基类,它处理对象到db和db到对象的映射
ActiveRecord
的子类是一种通用的User
类,处理用户会话、登录、保存时密码字段的加密等
ActiveRecord
的另一个子类是ActiveRecord,但稍微高级一些。通常这个类与用户
无关,但我的问题是
我希望有一个子类,它本质上是User
和activerecord的组合,但稍微高级一点
<代码>用户,但稍微更高级
,而不必从用户
复制粘贴所有方法。对于User
来说,扩展ActiveRecord而稍微高级一点是没有意义的,因为它需要从本质上重写一系列对用户有不良行为的方法。
对用户来说,扩展ActiveRecord但稍微高级一点
是有意义的,但我必须从用户
复制并粘贴一系列方法
我知道有些人用图片思考得更好,所以下面是图示的结构
基地
孩子
class User extends ActiveRecord
{
....
}
也是孩子
class ActiveRecordButSlightlyMoreAdvanced extends ActiveRecord
{
....
}
问题
class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced
{
:( :( :(
}
我已经思考这个问题大约一个月了,现在想不出一个解决方案,如果其中一个对象实现保存的方式发生了变化,那么它就不会同时增加维护对象的负担。在接下来的几天里,我将尝试一些解决方案,并可能发布我认为在这种情况下最好的解决方案。我猜你的意思是:
class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced
{
:) :) :)
}
如果是这样的话,研究一下你可能会尝试使用的策略模式。在这种情况下,您将创建您的类:
class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
private $_strategy;
public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
$this->_strategy = $s;
}
}
让你的策略课:
interface ActiveRecordButSlightlyMoreAdvancedStrategy
{
// Define what this should do here
}
创建一个实现上述接口的strategy类
class ActiveRecordButSlightlyMoreAdvanced implements ActiveRecordButSlightlyMoreAdvancedStrategry {
// Do stuff here
}
现在,当您调用这些高级方法时,两个类实现相同的接口,但UserButlyMoreAdvanced类只是将请求传递给strategy对象:
class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
private $_strategy;
public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
$this->_strategy = $s;
}
public function someSlightlyMoreAdvancedFunction () {
return $this->_strategy->someSlightlyMoreAdvancedFunction():
}
}
希望这能有所帮助。你说得对>
class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
private $_strategy;
public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
$this->_strategy = $s;
}
public function someSlightlyMoreAdvancedFunction () {
return $this->_strategy->someSlightlyMoreAdvancedFunction():
}
}