将C#lambda表达式移植到PHP

时间:2014-05-22 16:16:25

标签: c# php lambda porting strategy-pattern

我正在浏览这个关于OCP的blog post,我试图将代码从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);
    }
}

如何使用PHP的lambda表达式将CalculatePrice函数转换为PHP?

到目前为止,我能够做到这一点:

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

2 个答案:

答案 0 :(得分:0)

我想我会做这样的事情

public function CalculatePrice(OrderItem $item){
    foreach ($pricingRules as $rule) {
       if ($rule->IsMatch($item)){
          return $rule->CalculatePrice($item);
       }
    }
    return null;
}

因为,我认为,但我不确定,.First存在于php中,因此您必须自己编写相同的逻辑。另外,关于最终的return null您可能想要提出异常,因为您没有使用.FirstOrDefault

答案 1 :(得分:0)

在关闭闭包后,我可以将其移植到PHP,如下所示:

public function CalculatePrice(OrderItem $item) {      
    return array_filter($this->pricingRules, 
        function ($r) use ($item) {
            return $r->IsMatch($item);
        })[0];
}