Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php “一个物体可以吗?”;“进化”;变成其中一个的对象';什么是儿童班?_Php_Oop_Inheritance - Fatal编程技术网

Php “一个物体可以吗?”;“进化”;变成其中一个的对象';什么是儿童班?

Php “一个物体可以吗?”;“进化”;变成其中一个的对象';什么是儿童班?,php,oop,inheritance,Php,Oop,Inheritance,假设我们有一个父类和一个子类。父类检查一些参数并确定子类更适合处理给定的请求-是否有方法将现有(父)对象重新创建为父对象中的子类对象 父类的示例: /** * Simple car */ class car { /** * The constructor */ public function __construct() { // (...) } /** * Add a sunroof to the car

假设我们有一个父类和一个子类。父类检查一些参数并确定子类更适合处理给定的请求-是否有方法将现有(父)对象重新创建为父对象中的子类对象

父类的示例:

/**
 * Simple car
 */
class car {
    /**
     * The constructor
     */
    public function __construct() {
        // (...)
    }

    /**
     * Add a sunroof to the car
     */
    protected function addSunRoof() {
        // (...)
    }

    /**
     * Parse a config string and configure the car accordingly
     * @param string $config
     */
    public function configure($config) {
        $options = explode(";", $config);

        // Do something for every option in $config string
        foreach ($options as $o) {
            switch ($o) {
                case "sunroof" : 
                    $this->addSunRoof();
                    break;
                case "4x4" :
                    // 'car' does not have support for '4x4', but the child class 'suv' does
                    // -> This 'car' object should therefore 'evolve' and become a 'suv' object - how?
                case "foo" :
                // (...)
            } // switch

        } // foreach
    } // configure
} // car
子类的示例:

/**
 * SUV car
 */
class suv extends car {
    /**
     * Add 4x4 drive
     */
    protected function add4x4() {
        // (...)
    } // add4x4
} // suv
现在,获取
suv
对象最明显的方法是从一开始就直接创建它:

$car = new suv();
$car->configure($config);
挑战在于,我不知道在创建对象时是否需要
car
suv
对象;我不知道
$config
字符串包含哪些选项,直到在
$car->configure()
方法中对其进行分析(字符串可以来自任何地方,例如用户输入)

一个简单的解决方法是将
configure
方法移出
car
,以便在创建任何对象之前分析字符串-但是,它在逻辑上属于
car
对象,因此我确实希望将其保留在那里:)

有办法解决这个难题吗?如果不是,您认为什么是“最干净”的解决方法

提前谢谢

编辑:

正如有人指出的那样,我的问题与此非常相似:
答案是技术上可行,但不应该这样做。然而,一个令人信服的替代方案尚未被提出(有人建议使用工厂,但我觉得这只能解决问题的一部分)。

如评论中所述,最常用的方法是使用静态方法,将字符串作为参数并返回正确的实例。 这样,您就可以将该方法保留在car类中,正如您所说,car类是最符合逻辑的


顺便说一下,如果更多的是关于在现有对象上添加特征的话。你可以考虑一下。通过这种方式,您可以有一个静态方法,获取配置字符串和现有汽车,并返回给定的汽车,其中装饰有与配置匹配的特性。这使您可以更灵活地处理所有的利弊(拖拉机上可以有遮阳棚)。

家长不应该知道孩子的情况,到此为止。父母是独立的,孩子可以扩展和改变自己的行为;父母应该幸福地意识到这一点。子对象依赖于父对象,如果父对象也依赖于子对象,那么您有一个conumdrum。使用带有configure方法的CarFactory类返回最适合的实例如何?“configure”这个名称在这里不是最好的名称。@Voooza,Ashwin Mukhija:如果我正确理解工厂的概念,这意味着我必须解析配置字符串两次;一旦进入工厂决定要创建哪个对象,一旦进入对象本身,“使用字符串配置自身”是car类所需的功能,公共setter方法实际上不是一个选项。是否要动态重新配置汽车?当你在寻找停车位时,你想让你的车一离开高速公路就从法拉利换成哈默,换成迷你库珀?那太酷了。我也想要。否则,您可以从已配置的工厂选择您的汽车。