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


extending class but base call needs to call extended class

我有一个大类,我把它分解成更小的块。

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

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

// 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 类或扩展 A 类的 B 类。

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

听起来也许你应该使用工厂模式,尽管如果没有更多信息很难分辨。 不过,某种 OOP 模式在这里适用。 看看这个。

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

编辑

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

如果类 B 仅显示为类 A 的一部分,那么您应该至少明确它不能在类之外使用。 在你包含 b 之前设置一些变量或其他东西.php如果它没有在 b 中设置,则错误出来,这样如果其他人包含它,变量就不会被设置,很明显该类不应该在类 A 之外使用。

如果你正在创建一个单独的实例,B 真的是 A 的子类吗? 初始化为 A 的新对象在构造过程中将充当 B,但如果某个方法需要 B 对象,则无法传入初始化为 A 的对象,而如果您使用包装类,并且它实际上返回了 B,它将在期望 B 的地方正常工作。 这取决于您的情况有多复杂,是否会出现这种情况。

工厂模式绝对是这里的一种方式,但要记住的另一件事是"is a"和"has a"之间的区别。

你现在让一切正常的方式,使用继承,是一种"是"的关系,B是A。

具有 A 关系 woould 使 B 成为自己的类,具有 A 类型的属性。 这样,您可以使用 A 类对象初始化 B,并利用 A 中的所有数据和验证,而这两个类没有任何基于继承的关系。

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