Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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_Inheritance_Design Patterns_Composition_Php 5.5 - Fatal编程技术网

Php 如何避免继承并使其看起来像我';我在叫一门课?

Php 如何避免继承并使其看起来像我';我在叫一门课?,php,inheritance,design-patterns,composition,php-5.5,Php,Inheritance,Design Patterns,Composition,Php 5.5,我感兴趣的是如何在不使用继承的情况下正确完成以下操作: 我想在我的应用程序中拨打如下电话: // I don't want to do this: // $temp = new Sedan; // $myCar = new Car($temp); // $myCar->paint(); // nor this: // $myCar = new Car(new Sedan); // $myCar->paint(); // Instead I want this: $myCar =

我感兴趣的是如何在不使用继承的情况下正确完成以下操作:

我想在我的应用程序中拨打如下电话:

// I don't want to do this:
// $temp = new Sedan;
// $myCar = new Car($temp);
// $myCar->paint();

// nor this:
// $myCar = new Car(new Sedan);
// $myCar->paint();

// Instead I want this:
$myCar = new Sedan;   
$myCar->paint();
喷漆方法实际上是Car类的一部分:

class Car {
    private $carToPaintOn;  // <-- Instance of Sedan would be stored here      

    public function __construct(CarInterface $car){
        $this->carToPaintOn = $car;
    }

    public function paint(){
        // paint some car
    }
}
等级车{
private$carToPaintOn;//carToPaintOn=$car;
}
公共功能涂料(){
//给汽车上油漆
}
}
如果不使用继承,class
Sedan
(或
Coupe
Convertable
或诸如此类)会是什么样子? 类代码必须使用行业标准设计模式,并遵循干净和可测试代码的指导原则。另外,请避免将
喷漆
方法添加到轿车中,以避免重复该方法


编辑:事后看来,我应该将类命名为“Car”,并给它一个名为“Paintable”的接口,以便更好地理解这一点。

这应该是继承,因为轿车是一辆车,但轿车没有车,但如果你真的想避免它

class Sedan implements CarInterface {
    private $car;
    public function __construct() {
        $this->car = new Car($this);
    }
    function __call($method_name, $args) {
        if (!method_exists($this, $method_name)) {
            return call_user_func_array(array($this->car, $method_name), $args);
        }
    }
}

这个例子是继承的完美例子。下面的代码将完全执行您所说的操作。这里不需要特征或注射什么东西


你的教授不想让我们回答你的家庭作业。看看我的个人资料,我不在大学里-但是我正试图解决我和其他人的一次讨论(如果你必须知道的话)哈!不可能。您不能实例化一个
Sedan
对象并让它返回一个
Car
对象。为了更接近,您可以将工厂模式和委托模式结合起来。但即使这样也不能满足您的所有要求,例如间接实例化和自动依赖注入。孩子们,请不要在家里这样做。我知道,我只是认为汽车很容易思考,也想不出另一个简单的主题(我所有的例子都指向复杂性)。哇!好的,这与我想的解决方案非常接近,但是我已经把构造函数和_调用都放到了一个traits中,所以我想,如果我想以这种方式调用
Sedan
,只需要包含这个特性。否则,我可以使用典型的装饰调用方法。?这就像是装饰的反面。我叫它室内装潢师。这是可以接受的做法吗?(例如,组合重于继承等等)这有一个名字:委托。这个例子的目的是展示如何在不使用继承的情况下正确地完成它。我听说高级开发人员说他们已经好几年没有使用继承了@戴维德格拉汉姆:这是可以做到的,但“适当”不适合这里。
<?php

class Car {
    public function paint () {
        echo " ________   \n";
        echo "/        \__\n";
        echo "|___________\\\n";
        echo "  O      O\n";
    }
}

class Sedan extends Car {

}

$sedan = new Sedan;
$sedan->paint();