将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);
    }
}

将c# lambda表达式移植到PHP

我想我会这样做

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];
}