在PHP中创建一个接口,该接口可以指定一个类型来确定使用哪个类
我正在为“拾取点”创建一个界面,每个拾取点都需要能够返回找到的所有拾取点以及拾取点的详细信息,将来可能还会返回更多信息。下面的代码没有问题:在PHP中创建一个接口,该接口可以指定一个类型来确定使用哪个类,php,oop,design-patterns,interface,Php,Oop,Design Patterns,Interface,我正在为“拾取点”创建一个界面,每个拾取点都需要能够返回找到的所有拾取点以及拾取点的详细信息,将来可能还会返回更多信息。下面的代码没有问题: <?php interface iPickupPoint { public function getPickupPoints($countryCode, $postalCode, $city); public function getPickupPointDetails($pickupPointId); } class Pick
<?php
interface iPickupPoint
{
public function getPickupPoints($countryCode, $postalCode, $city);
public function getPickupPointDetails($pickupPointId);
}
class PickupPoint1 implements iPickupPoint{
...
}
class PickupPoint2 implements iPickupPoint{
...
}
我将创建一个拾取点函数,在该函数中,您可以使用if语句指定拾取点编号
Pickup Point ($pickuppointnum) {
if ($pickuppointnum == 1){
//Pickup Point information for Pickuppoint #1
}
elseif ($pickuppointnum ==2) {
//Pickup Point information for Pickuppoint #2
}
}
我将创建1个拾取点函数,在其中指定拾取点编号,并在其中使用if语句
Pickup Point ($pickuppointnum) {
if ($pickuppointnum == 1){
//Pickup Point information for Pickuppoint #1
}
elseif ($pickuppointnum ==2) {
//Pickup Point information for Pickuppoint #2
}
}
您所描述的是工厂模式,所以是的,这是一个最佳实践
您的工厂本身不需要实现该接口。它可以是一个静态类,甚至可以是一个函数:
class PickupPointFactory{
public static function create($type){
/* your creation logic here */
switch ($type) {
case "PickupPoint1" :
$obj = new PickupPoint1();
break;
case "PickupPoint2" :
$obj = new PickupPoint2();
break;
}
return $obj;
}
}
$newPoint = PickupPointFactory::create("PickupPoint2");
创建逻辑可以更加通用,以避免每次向应用程序添加类时都更改工厂:
class PickupPointFactory{
public static function create($type, $options){
/* your creation logic here */
if(file_exists(dirname(__FILE__).'/'.$type.'.class.php')) {
require_once(dirname(__FILE__).'/'.$type.'.class.php');
$obj = new $type($options);
return $obj;
} else {
throw new Exception('Unknown PickupPoint type: '.$type);
}
}
}
$newPoint = PickupPointFactory::create("PickupPoint2", array());
这是假设您正在工厂所在的同一目录中的名为“PickupPoint1.class.php”的文件中创建类,并且类中的构造函数只需要一个参数
我没有测试这段代码,所以可能出现了一些错误。您描述的是工厂模式,所以是的,这是一个最佳实践
您的工厂本身不需要实现该接口。它可以是一个静态类,甚至可以是一个函数:
class PickupPointFactory{
public static function create($type){
/* your creation logic here */
switch ($type) {
case "PickupPoint1" :
$obj = new PickupPoint1();
break;
case "PickupPoint2" :
$obj = new PickupPoint2();
break;
}
return $obj;
}
}
$newPoint = PickupPointFactory::create("PickupPoint2");
创建逻辑可以更加通用,以避免每次向应用程序添加类时都更改工厂:
class PickupPointFactory{
public static function create($type, $options){
/* your creation logic here */
if(file_exists(dirname(__FILE__).'/'.$type.'.class.php')) {
require_once(dirname(__FILE__).'/'.$type.'.class.php');
$obj = new $type($options);
return $obj;
} else {
throw new Exception('Unknown PickupPoint type: '.$type);
}
}
}
$newPoint = PickupPointFactory::create("PickupPoint2", array());
这是假设您正在工厂所在的同一目录中的名为“PickupPoint1.class.php”的文件中创建类,并且类中的构造函数只需要一个参数
我没有测试这段代码,所以可能有一些bug滑了进来。当我们有10个或更多拾取点时,这会变得很难看。当我们有10个或更多拾取点时,这会变得很难看。你为什么要将每个拾取点放在自己的类中?他们有那么不同吗?这显然是在混淆类与实例以及类的接口。它们是不同的,因为它们是不同公司的服务,它们需要从不同的数据源(web服务、数据库等)获取数据。啊哈,这就解释了:)使用工厂模式,我可以建议更好的命名吗?:)PickupPoint1、PickupPoint2只是虚构的示例;)你为什么要把每个收货点都放在自己的课上?他们有那么不同吗?这显然是在混淆类与实例以及类的接口。它们是不同的,因为它们是不同公司的服务,它们需要从不同的数据源(web服务、数据库等)获取数据。啊哈,这就解释了:)使用工厂模式,我可以建议更好的命名吗?:)PickupPoint1、PickupPoint2只是虚构的示例;)值得注意的是,工厂方法(在您的例子中是create()
)通常是按照约定命名为factory()
。我不知道这一点。是否有支持此约定的参考书目?值得注意的是,工厂方法(在您的案例中是create()
)通常按约定命名为factory()
。我不知道这一点。是否有支持该公约的参考书目?