2014-05-22 1 views
2

나는 OCP에 대해이 blog post을 통해 가고 있었고 나는 C#에서 PHP로 코드를 이식하려고했다.PHP에 C# λ 식을 이식하는 것

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의 람다 표현식을 사용하는 것이 바람직 PHP에 CalculatePrice 기능을 은밀한 않습니다
나는 어려움이 기능을 포팅하는 데 문제가? 여기

내가 지금까지 할 수 있었던 것입니다 : 내가 생각하기 때문에 나는이

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

처럼 뭔가를 할 것이라고 생각

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'IsMatch'가 어떻게 보이는지 보여주기 위해'PricePerUnitStrategy' 클래스를 추가했습니다. C# 또는 PHP 람다 식에 익숙하지 않아서 어떻게 호출되는지 잘 모르겠습니다. – Songo

답변

0

확인을 사용하지 않았다 같은 예외를 발생 할 수 있습니다 다음과

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

,하지만 나는 것을 확실하지 않다 .First이 PHP에 존재하므로 동일한 논리를 직접 작성해야합니다. 폐쇄에 읽는 조금 나는 그것이로 PHP 포트 수있었습니다 또한, 최종 return null에 대해 당신이 .FirstOrDefault

관련 문제