有一个基类Product,它具有产品应该具有的所有泛型属性和方法。
abstract class Product
{
public abstract function process();
}现在,这些是少数几种产品,可能有,也可能没有类似的逻辑。
class Shirt extends Product
{
public function process()
{
return 0;
}
}
class Trouser extends Product
{
public function process()
{
return 1;
}
}
class PocketSquare extends Product
{
public function process()
{
return 2;
}
}我使用switch语句来区分和初始化对象。
$products = $db->query("SELECT * FROM products LIMIT 10");
foreach ($products as $key => $product) {
switch ($product->type) {
case 'shirt':
$products[$key] = new Shirt($product);
break;
case 'trouser':
$products[$key] = new Trouser($product);
break;
case 'pocketsquare':
$products[$key] = new PocketSquare($product);
break;
}
}有什么办法避免开关语句吗?或者有什么更好的方法?
发布于 2019-07-16 12:45:38
对此,常见的替代方法是对解决方案采取声明式的方法:用lambdas的hashmap替换那个switch语句。
我已经很多年没有使用PHP了,所以我可能有以下语法错误,但是您可能会这样做:
$productsMap = array (
'shirt' => function ($p) { return new Shirt($p); },
'trouser' => function ($p) { return new Trouser($p); },
'pocketsquare' => function ($p) { return new PocketSquare($p); }
);
...
$products = $db->query("SELECT * FROM products LIMIT 10");
foreach ($products as $key => $product) {
$products[$key] = $productsMap[$product->type]();
}https://softwareengineering.stackexchange.com/questions/394747
复制相似问题