这是基本前提,我正在使用db对象的活动记录模式,我认为我需要一些指导如何组织这些类。而且一般来说我怎么可能分裂我的班级结构。希望我不会解释这个太过分了。如果构图模式是要走的路,我可能需要一点手握住实现它的方法。
假设有ActiveRecord
基类,位于图腾柱的底部,用于处理将对象映射到数据库,将数据库映射到对象。
ActiveRecord
的子类是一种通用的User
类,用于处理用户会话,登录,保存时密码字段的加密等。
ActiveRecord
的另一个孩子是ActiveRecordButSlightlyMoreAdvanced
班。通常这个类与User
无关,但这是我的问题。
我希望有一个子类,它基本上是User
和ActiveRecordButSlightlyMoreAdvanced
的组合; UserButSlightlyMoreAdvanced
,无需复制粘贴User
中的所有方法。 User
扩展ActiveRecordButSlightlyMoreAdvanced
没有意义,因为它需要基本上覆盖一堆对User
有不良行为的方法。
UserButSlightlyMoreAdvanced
扩展ActiveRecordButSlightlyMoreAdvanced
是有意义的,但我必须从User
复制并粘贴一堆方法。
我知道有些人会对图片有更好的认识,所以这是图示的结构。
基
class ActiveRecord
{
....
}
孩子
class User extends ActiveRecord
{
....
}
也是孩子
class ActiveRecordButSlightlyMoreAdvanced extends ActiveRecord
{
....
}
问题
class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced
{
:( :( :(
}
我一直在考虑这个问题大约一个月了,如果有人改变其中一个实现保存的方式,就不会想到一个不会给维护对象带来负担的解决方案。我将在接下来的几天内尝试一些解决方案,并可能发布我认为在这种情况下最好的解决方案。
答案 0 :(得分:1)
我的猜测是你想说的:
class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced
{
:) :) :)
}
如果是这种情况,请查看特征http://php.net/manual/en/language.oop5.traits.php
答案 1 :(得分:0)
您可以尝试使用策略模式。在这种情况下,您将创建您的类:
class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
private $_strategy;
public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
$this->_strategy = $s;
}
}
制作策略课程:
interface ActiveRecordButSlightlyMoreAdvancedStrategy
{
// Define what this should do here
}
创建一个实现上述接口的策略类。
class ActiveRecordButSlightlyMoreAdvanced implements ActiveRecordButSlightlyMoreAdvancedStrategry {
// Do stuff here
}
现在,当您调用这些高级方法时,两个类都实现相同的接口,但UserButSlightlyMoreAdvanced类只是将请求传递给策略对象:
class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
private $_strategy;
public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
$this->_strategy = $s;
}
public function someSlightlyMoreAdvancedFunction () {
return $this->_strategy->someSlightlyMoreAdvancedFunction():
}
}
希望有所帮助。