Php 当我需要在创建对象之前调用辅助函数时,我应该使用什么设计模式?

Php 当我需要在创建对象之前调用辅助函数时,我应该使用什么设计模式?,php,oop,design-patterns,Php,Oop,Design Patterns,我有一个类电机,用于提供各种电机规格 我目前有以下方法作为Motor课程的一部分: 公共函数getIdFromModel($model) { $sql=“从…中选择id,其中模型=…”; 返回过程($sql); } 公共函数getIdByFrame($size) { $sql=“从…中选择id,其中大小=…”; 返回过程($sql); } 以上是补充功能,当已知其他一些非id参数时,用于从数据库获取电机的idid然后用于创建实际电机 在我能够做到之前: $model=“ABC”; $motor

我有一个类
电机
,用于提供各种电机规格

我目前有以下方法作为
Motor
课程的一部分:

公共函数getIdFromModel($model)
{
$sql=“从…中选择id,其中模型=…”;
返回过程($sql);
}
公共函数getIdByFrame($size)
{
$sql=“从…中选择id,其中大小=…”;
返回过程($sql);
}
以上是补充功能,当已知其他一些非
id
参数时,用于从数据库获取电机的
id
<代码>id然后用于创建实际电机

在我能够做到之前:

$model=“ABC”;
$motor=新电机();
//检索ID
$id=$motor->getIdFromModel($model)
$motor loadSpecs($id);
$motor=新电机($id);
我的问题出现在我改变了班级结构,要求在
Motor
创建时掌握
id
知识之后。现在我需要做:

$model=“ABC”;
//检索ID
$id=$???->getIdFromModel($model)
$motor=新电机($id);
问题


我应该使用什么结构/类别/模式/功能来代替上面的


我知道我可以为上面两个函数创建一个类,但我觉得有更好的答案/模式,我想问一下。我看不出仅仅为标识方法的东西创建类的意义。我希望有一些意义。

我会让它们成为静态功能,马达的成员

public static function getIdFromModel($model)
{
  ..
}
然后可以调用该函数,而无需实例

$id = Motor::getIdFromModel($model)

您通常会使用工厂模式进行此操作。它可以是一个独立函数,也可以是一个静态类方法,具体取决于您想要如何实现它


工厂方法+支持方法

用法:

$id = 17;
$model = "ABC";
$frame = "T123";

$factory = new MotorFactory();

//instantiation via various pieces of data
$motor = $factory->fromId($id);
$motor = $factory->fromModel($model);
$motor = $factory->fromFrame($frame);
class MotorFactory
{
    public function fromId($id)
    {
        return new Motor($id);
    }

    public function fromModel($model)
    {
        $id = $this->getIdFromModel($model);
        return $this->fromId($id);
    }

    public function fromFrame($frame)
    {
        $id = $this->getIdFromFrame($frame);
        return $this->fromId($id);
    }

    //supporting methods
    private function getIdFromModel($model)
    {
        $sql = "SELECT id FROM ... WHERE model = ...";
        return process($sql);
    }

    private function getIdFromFrame($size)
    {
        $sql = "SELECT id FROM ... WHERE size = ...";
        return process($sql);
    }
}
工厂方法:

$id = 17;
$model = "ABC";
$frame = "T123";

$factory = new MotorFactory();

//instantiation via various pieces of data
$motor = $factory->fromId($id);
$motor = $factory->fromModel($model);
$motor = $factory->fromFrame($frame);
class MotorFactory
{
    public function fromId($id)
    {
        return new Motor($id);
    }

    public function fromModel($model)
    {
        $id = $this->getIdFromModel($model);
        return $this->fromId($id);
    }

    public function fromFrame($frame)
    {
        $id = $this->getIdFromFrame($frame);
        return $this->fromId($id);
    }

    //supporting methods
    private function getIdFromModel($model)
    {
        $sql = "SELECT id FROM ... WHERE model = ...";
        return process($sql);
    }

    private function getIdFromFrame($size)
    {
        $sql = "SELECT id FROM ... WHERE size = ...";
        return process($sql);
    }
}

反射(我认为)我建议使用一种返回
$motor
实体的方法,而不是使用单独的“水合lite”方法的getter设置。在我看来,一个物体并不是自己创造出来的。另请参见:您有没有选择过任何方法?我从上面的类中删除了这些方法,并将它们作为助手方法放入我的测试套件中。只有测试套件需要这些方法。因此,我的方法是“把冒犯的方法移到别处”。理想情况下,我会选择工厂模式,并在其内部使用类似于
idFromModel()
idFromFrame()
,并将其称为
$motor=new Factory()->getMotorFromModel($model)
$motor=new Factory()->getMotorFromFrame($frame)
$motor=new Factory()->getMotorFromId($id)“我应该用什么结构/类/模式/功能来代替上面的???”我知道这不是一个设计模式,但我已经回答了你的问题imho。。虽然我想找到一个更永久的家这些方法。我把它们看作是
Motor
类的更多支持方法。它们对电机不是必不可少的,我认为最好将它们从电机中移除。好的,我对你的问题不太清楚。祝你好运。