2014-05-22 56 views
2

我正在通过关于OCP的这个blog post,我试图将代码从C#移植到PHP。
我有困难移植这一功能:将C#lambda表达式移植到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); 
    } 
} 
+0

你的代码没有显示IsMatch方法是什么,它是一个扩展方法吗? – DavidG

+0

@DavidG我添加了'PricePerUnitStrategy'类来显示'IsMatch'的外观。我不熟悉C#或PHP lambda表达式,所以我不确定它是如何调用的。 – Songo

回答

0

OK的阅读关闭一点点后,我能够将它移植到PHP如下:

public function CalculatePrice(OrderItem $item) {  
    return array_filter($this->pricingRules, 
     function ($r) use ($item) { 
      return $r->IsMatch($item); 
     })[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