0

我有一个主类,我添加了大约十几个子类,类似于示例 #2。

我想知道是否有更好的方法来实现这一点。我知道我可以对类进行“扩展”(示例 #1),但是为了能够让一个变量访问所有扩展类函数,我必须“菊花链”扩展,然后创建一个新类最后一个扩展的参考 - 这个选项不是我想要的。

Example #1:

class main {
    function _construct(){}
    function main_function1(){}
    function main_function2(){}
}
class child1 extends main{
    function _construct(){}
    function child_function1(){}
    function child_function2(){}
}
class child2 extends child1 {
    function _construct(){}
    function child_function3(){}
    function child_function4(){}
}
$main = new child2();
$main->child_function1();
$main->child_function2();
$main->child_function3();
$main->child_function4();

这是我目前正在做的事情。

Example #2:

<?php

class main {
    function _construct(){}
    function main_function1(){}
    function main_function2(){}
}
class child1 {
    function _construct($main){$this->main = $main;}
    function child_function1(){}
    function child_function2(){}
}
class child2 {
    function _construct($main){$this->main = $main;}
    function child_function3(){}
    function child_function4(){}
}
$main = new main();
$main->child1 = new child1($main);
$main->child2 = new child2($main);

$main->child1->child_function1();
$main->child1->child_function2();
$main->child2->child_function3();
$main->child2->child_function4();

?>

Example #2 是实现我所寻找的最佳方法吗?

4

3 回答 3

1

通过做

class child {
    function __construct($main){$this->main = $main;}
}

示例 2中,您将$main实例作为child构造函数中的属性传递。$main在我看来,如果是一个提供信息的容器,这将是有道理的child——如果您想避免使用带有许多参数的构造函数,这将很有用。根据你的命名,它看起来不像main是一个容器。请注意,您正在创建 和 之间的依赖关系childmain因为如果您想实例化child,您总是需要main提前的实例!您在示例 2中所做的是创建循环引用

$main = new main();
$main->child1 = new child1($main);
$main->child2 = new child2($main);

您将可以调用$main->child1->mainthen ,这意味着 和 之间的高度main耦合child。所以我宁愿不说“去示例 2”。

在您的情况下,听起来child实际上的一个特例main,例如水果(主)和苹果(子)之间的关系。这使得使用extends更加合理。您似乎不确定,因为您有许多子类扩展main. 对我来说,这听起来很正常,如果所有child类都有相似的目的并共享一些由main. 但我不太确定你的目标到底是什么。

于 2013-10-23T22:38:53.943 回答
0

扩展类可能会破坏封装,因此根据您的类,最好将对象分开,如示例 #2 所示。你可以有一个加载函数来简化主类的设置:

class main {
    function load($class){
        $this->$class = new $class();
    }
}
$main = new main();
$main->load('child1');
$main->child1->child_function1();
于 2013-10-23T22:20:59.040 回答
-1

在 php 中,您有两个选择。(在 2020 年)按照第一个答案中的建议将您的 Helper Class 注入另一个类,或者在 PHP 中您可以使用traits

特征类似于类,但它们的构造函数不能是公共的。在特征上使用依赖注入很困难,但特征可以使用方法扩展现有类,并且它们可以访问各自类的父方法。

无论如何,使用特征你不能覆盖父方法,你只能将方法添加到堆栈中。

trait 的另一个缺点是,当您使用包含类的父方法时,某些 IDE 不能很好地支持类型提示。因此,为了使类型提示正常工作,您需要一些解决方法。

于 2020-12-06T11:04:14.177 回答