我正在通過關於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);
}
}
你的代碼沒有顯示IsMatch方法是什麼,它是一個擴展方法嗎? – DavidG
@DavidG我添加了'PricePerUnitStrategy'類來顯示'IsMatch'的外觀。我不熟悉C#或PHP lambda表達式,所以我不確定它是如何調用的。 – Songo