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
类的更多支持方法。它们对电机不是必不可少的,我认为最好将它们从电机中移除。好的,我对你的问题不太清楚。祝你好运。