将c# lambda表达式移植到PHP
本文关键字:PHP 表达式 lambda | 更新日期: 2023-09-27 18:04:43
我正在浏览这篇关于OCP的博客文章,并试图将代码从c#移植到PHP。
我在移植这个函数时遇到了困难:
public class PricePerUnitStrategy
{
public bool IsMatch(OrderItem item)
{
return item.Identifier.StartsWith("Each");
}
public decimal CalculatePrice(OrderItem item)
{
return item.Quantity * 4m;
}
}
public class DefaultPriceCalculator
{
private readonly List<IPriceStrategy> _pricingRules;
public DefaultPriceCalculator()
{
_pricingRules = new List<IPriceStrategy>();
_pricingRules.Add(new PricePerKilogramStrategy());
_pricingRules.Add(new PricePerUnitStrategy());
_pricingRules.Add(new SpecialPriceStrategy());
}
public decimal CalculatePrice(OrderItem item)
{
return _pricingRules.First(r => r.IsMatch(item)).CalculatePrice(item);
}
}
如何将CalculatePrice
函数转换为PHP最好使用PHP的lambda表达式?
到目前为止我所能做的是:
class OrderItem{
public $Identifier;
public $Quantity;
}
class PricePerUnitStrategy{
public function IsMatch(OrderItem $item){
return $item->Identifier=="Each";
}
public function CalculatePrice(OrderItem $item){
return $item->Quantity * 4;
}
}
class DefaultPriceCalculator{
private $pricingRules;
public function __construct(){
$pricingRules = array();
$pricingRules[]=new PricePerUnitStrategy();
}
public function CalculatePrice(OrderItem $item){
return $pricingRules->First(r => r.IsMatch($item))->CalculatePrice($item);
}
}
我想我会这样做
public function CalculatePrice(OrderItem $item){
foreach ($pricingRules as $rule) {
if ($rule->IsMatch($item)){
return $rule->CalculatePrice($item);
}
}
return null;
}
因为,我认为,但我不确定,.First
存在于php中,所以你必须自己编写相同的逻辑。此外,关于最后的return null
,您可能想要引发异常,因为您没有使用.FirstOrDefault
好了,在阅读了闭包之后,我能够将它移植到PHP中,如下所示:
public function CalculatePrice(OrderItem $item) {
return array_filter($this->pricingRules,
function ($r) use ($item) {
return $r->IsMatch($item);
})[0];
}