2014-05-22 95 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