Search code examples
c#phplambdaportingstrategy-pattern

Porting a C# lambda expression to PHP


I was going through this blog post about the OCP and I was trying to port the code from C# to PHP.
I'm having difficulty porting this function:

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

How do you covert the CalculatePrice function to PHP preferably using PHP's lambda expressions?

Here is what I was able to do so far:

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

Solution

  • OK after a little bit of reading on closure I was able to port it to PHP as follows:

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