我有一个大班,我正在分成更小的块。
所以我有一个基类和一个扩展基类的新类。
我的问题是,我可以从基类调用扩展类吗?这似乎不对。
// 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类。
只是想确认这是最好的选择,感谢输入
答案 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上的属性或方法。