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 不同的类总是有一个公共属性的sing实例_Php_Oop_Object_Design Patterns - Fatal编程技术网

Php 不同的类总是有一个公共属性的sing实例

Php 不同的类总是有一个公共属性的sing实例,php,oop,object,design-patterns,Php,Oop,Object,Design Patterns,让我们以制造商/车型为例。模型有特定的制造商。因此,假设“Punto”、“500”、“Panda”等车型的制造商始终是“菲亚特” 如果每个模型都是一个类,并且制造商是一个类实例,那么在没有多个制造商类实例的情况下,将模型连接到制造商的最干净/最佳解决方案是什么。通过构造函数设置它们是显而易见的,因为模型永远不会改变它的制造者 让我们用一个简化的代码示例来说明我的问题: class Manufacturer { protected $name; public function _

让我们以制造商/车型为例。模型有特定的制造商。因此,假设“Punto”、“500”、“Panda”等车型的制造商始终是“菲亚特”

如果每个模型都是一个类,并且制造商是一个类实例,那么在没有多个制造商类实例的情况下,将模型连接到制造商的最干净/最佳解决方案是什么。通过构造函数设置它们是显而易见的,因为模型永远不会改变它的制造者

让我们用一个简化的代码示例来说明我的问题:

class Manufacturer
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }
}

abstract class Car
{
    protected $manufacturer;

    public function __construct(Manufacturer $manufacturer)
    {
        $this->manufacturer = $manufacturer;
    }

    abstract public function getModel();

    public function getManufacturer()
    {
        return $this->manufacturer;
    }
}

class ModelA extends Car
{
    public function getModel()
    {
        return 'A';
    }
}

class ModelB extends Car
{
    public function getModel()
    {
        return 'B';
    }
}

// The manufacturer instance
$manufacturerC = new Manufacturer('C');

// Setting the manufacturer for the models is obvious
// because they always get manufactured from the manufacturer "C"
// and never from a manufacturer "X"
$modelA = new ModelA($manufacturerC);
$modelB = new ModelB($manufacturerC);

我能想出的最佳解决方案是:

模型包含制造商的类名。通过这种方式,我可以从保存所有制造商实例的
ManufacturerPool
中获取制造商实例

abstract class Manufacturer
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }
}

class ManufacturerC extends Manufacturer
{
    public function __construct()
    {
        parent::__construct('C');
    }
}

abstract class Car
{
    abstract public function getModel();

    abstract public function getManufacturer();
}

class ModelA extends Car
{
    public function getModel()
    {
        return 'A';
    }

    public function getManufacturer()
    {
        return C::class;
    }
}

class ModelB extends Car
{
    public function getModel()
    {
        return 'B';
    }

    public function getManufacturer()
    {
        return C::class;
    }
}

// The manufacturer instance
$manufacturerPool = new ManufacturerPool();
$manufacturerPool->add(new ManufacturerC());

$modelA = new ModelA();
$modelB = new ModelB();

$manufacturerPool->get($modelA->getManufacturer()); // Returns instance of "C"
$manufacturerPool->get($modelB->getManufacturer()); // Returns instance of "C"

此解决方案的缺点是每个制造商都必须是自己的类。

我将使用&@RonDadon传递对实例的引用,这就是我的示例代码的工作方式。但是为模型设置制造商的参考是显而易见的,因为它始终是相同的。如果使用参考,则制造商的更改将反映在所有依赖它的模型中。传递它的方式是传递实例的副本,因此实例本身的更改不会反映在“cars”中。