扩展类但基本调用需要调用扩展类

时间:2011-05-09 20:49:08

标签: php class refactoring

我有一个大班,我正在分成更小的块。

所以我有一个基类和一个扩展基类的新类。

我的问题是,我可以从基类调用扩展类吗?这似乎不对。

// a.php
class A {
    // set all the properties and runs some validation and functionality in the process
}

// b.php
class B extends A {
    // needs all the same validation as class A and adds more functionality
}

要启动该过程,我只能调用A类,例如:

$process = new A();

在A类中,我需要决定是否需要B类功能

class A {
    if($condition) {
        include_once('b.php');
        $new_process = new B();
        $new_process->doMoreStuff();
    }
}

我可以添加doMoreStuff()(更多功能),但这样做会破坏较小的类文件大小。

我知道正确的方法是创建一个包装器脚本并将逻辑放在那里,如果要使用A类或B类。但是还有其他原因我不能按照我的要求去做吗?

更新:

让我澄清A类是什么:

A类设置所有数据库连接,验证INI属性,并设置初始日志记录值。 A类还有一个处理特定请求的工作流程/流程。

B类需要A类的数据库,INI属性和日志记录,但也提供了新的工作流程/流程。我只想将A的功能扩展到另一个类(以使其更易于管理)。

所以我认为应该有一个决策类C决定只使用A类或B类扩展A类。

只是想确认这是最好的选择,感谢输入

3 个答案:

答案 0 :(得分:3)

听起来好像你应该使用工厂模式,虽然没有更多信息很难分辨。虽然某种oop模式适用于此。看看这个。

http://www.php.net/manual/en/language.oop5.patterns.php

修改

您的想法是朝着正确方向迈出的一步,但似乎您的申请违反了单一责任原则(SRP)。 A类有几项责任,因此有很多原因可能会改变。您可能希望有一个初始化的类,一个处理数据库连接的类,以及一个处理日志记录的类。这将使您的应用程序将来更容易修改。然后,您可以使用依赖注入(通常通过构造或方法参数)将这些类传递给任何其他需要它们的类,或者在需要时简单地在包装类中使用它们。

答案 1 :(得分:1)

如果B类只显示为A类的一部分,那么你应该至少明白它不能在课外使用。在包含b.php之前设置一些变量或其他内容,如果没有在b中设置错误输出,那么如果其他人包含它,则该变量将不会被设置,并且很明显该类不是在A级以外使用。

如果你要创建一个单独的实例,那么B真的是A的子类吗?初始化为A的新对象在构造过程中会像B一样运行,但如果某个方法需要B对象,则无法传入初始化为A的对象,而如果使用了包装类,则实际返回一个B,它可以正常地用于期望B的地方。这取决于你的情况有多复杂,如果这可能会出现。

答案 2 :(得分:1)

工厂模式绝对是这里的一种方式,但要记住的另一件事是“是一个”和“有一个”之间的区别。

你现在所有工作的方式,使用继承,是一种“是一种”关系b是一种。

有一种关系可以使b成为自己的类,具有a类型的属性。这样你就可以用一个类对象初始化b,并在a中使用所有数据和验证,而两个类没有任何基于继承的关系。

不是差异的最佳解释......但重要的问题是,这些属性/方法是否实际上属于b上的属性或方法。