Bird
Raised Fist0
PHPprogramming~20 mins

Strategy pattern in PHP - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Strategy Pattern Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Strategy pattern example?

Consider the following PHP code implementing a simple Strategy pattern for sorting an array. What will be the output when running this code?

PHP
<?php
interface SortStrategy {
    public function sort(array $data): array;
}

class BubbleSort implements SortStrategy {
    public function sort(array $data): array {
        $n = count($data);
        for ($i = 0; $i < $n; $i++) {
            for ($j = 0; $j < $n - $i - 1; $j++) {
                if ($data[$j] > $data[$j + 1]) {
                    $temp = $data[$j];
                    $data[$j] = $data[$j + 1];
                    $data[$j + 1] = $temp;
                }
            }
        }
        return $data;
    }
}

class ReverseSort implements SortStrategy {
    public function sort(array $data): array {
        rsort($data);
        return $data;
    }
}

class Sorter {
    private SortStrategy $strategy;

    public function __construct(SortStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function setStrategy(SortStrategy $strategy): void {
        $this->strategy = $strategy;
    }

    public function sort(array $data): array {
        return $this->strategy->sort($data);
    }
}

$data = [3, 1, 4, 1, 5];
$sorter = new Sorter(new BubbleSort());
$result1 = $sorter->sort($data);
$sorter->setStrategy(new ReverseSort());
$result2 = $sorter->sort($data);

print_r($result1);
print_r($result2);
?>
AArray ( [0] => 3 [1] => 1 [2] => 4 [3] => 1 [4] => 5 ) Array ( [0] => 3 [1] => 1 [2] => 4 [3] => 1 [4] => 5 )
BArray ( [0] => 5 [1] => 4 [2] => 3 [3] => 1 [4] => 1 ) Array ( [0] => 1 [1] => 1 [2] => 3 [3] => 4 [4] => 5 )
CFatal error: Uncaught Error: Call to undefined function rsort()
DArray ( [0] => 1 [1] => 1 [2] => 3 [3] => 4 [4] => 5 ) Array ( [0] => 5 [1] => 4 [2] => 3 [3] => 1 [4] => 1 )
Attempts:
2 left
💡 Hint

Think about what each strategy does to the array and the order of operations.

🧠 Conceptual
intermediate
1:30remaining
Why use the Strategy pattern?

Which of the following best explains the main benefit of using the Strategy pattern in PHP?

AIt allows changing the algorithm used by an object at runtime without modifying the object itself.
BIt forces all algorithms to be implemented in a single class for better performance.
CIt automatically generates code for different algorithms without manual coding.
DIt prevents any changes to the algorithm once the object is created.
Attempts:
2 left
💡 Hint

Think about flexibility and how the pattern helps with changing behavior.

🔧 Debug
advanced
2:30remaining
What error does this Strategy pattern code produce?

Examine the following PHP code snippet using the Strategy pattern. What error will it produce when run?

PHP
<?php
interface PaymentStrategy {
    public function pay(float $amount): string;
}

class CreditCardPayment implements PaymentStrategy {
    public function pay(float $amount): string {
        return "Paid $amount using credit card.";
    }
}

class PaypalPayment implements PaymentStrategy {
    public function pay(float $amount): string {
        return "Paid $amount using PayPal.";
    }
}

class PaymentContext {
    private PaymentStrategy $strategy;

    public function __construct(PaymentStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function setStrategy(PaymentStrategy $strategy): void {
        $this->strategy = $strategy;
    }

    public function pay(float $amount): string {
        return $this->strategy->pay($amount);
    }
}

$context = new PaymentContext(new CreditCardPayment());
echo $context->pay(100);
$context->setStrategy(new PaypalPayment());
echo $context->pay(50);
$context->setStrategy(new class implements PaymentStrategy {
    public function pay(float $amount): string {
        return "Paid $amount using Bitcoin.";
    }
});
echo $context->pay(25);
?>
AParse error: syntax error, unexpected 'class' (anonymous class syntax is invalid here)
BFatal error: Uncaught TypeError: Argument 1 passed to PaymentContext::setStrategy() must implement interface PaymentStrategy
COutput: Paid 100 using credit card.Paid 50 using PayPal.Paid 25 using Bitcoin.
DFatal error: Uncaught Error: Call to undefined method pay()
Attempts:
2 left
💡 Hint

Check the anonymous class passed to setStrategy and its relation to the interface.

📝 Syntax
advanced
1:30remaining
Which option correctly implements a Strategy interface in PHP?

Given the interface LoggerStrategy with method log(string $message): void, which option correctly implements this interface?

Aclass FileLogger implements LoggerStrategy { public function log(int $message): void { echo $message; } }
Bclass FileLogger implements LoggerStrategy { public function log(string $msg): void { file_put_contents('log.txt', $msg.PHP_EOL, FILE_APPEND); } }
Cclass FileLogger { public function log(string $message): void { echo $message; } }
Dclass FileLogger implements LoggerStrategy { public function log(string $message): string { return $message; } }
Attempts:
2 left
💡 Hint

Check method signatures and interface implementation rules.

🚀 Application
expert
2:30remaining
How many different strategies are used in this code?

Analyze the following PHP code using the Strategy pattern. How many distinct strategy classes are used to perform operations?

PHP
<?php
interface OperationStrategy {
    public function execute(int $a, int $b): int;
}

class AddOperation implements OperationStrategy {
    public function execute(int $a, int $b): int {
        return $a + $b;
    }
}

class MultiplyOperation implements OperationStrategy {
    public function execute(int $a, int $b): int {
        return $a * $b;
    }
}

class Calculator {
    private OperationStrategy $strategy;

    public function __construct(OperationStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function setStrategy(OperationStrategy $strategy): void {
        $this->strategy = $strategy;
    }

    public function calculate(int $a, int $b): int {
        return $this->strategy->execute($a, $b);
    }
}

$calc = new Calculator(new AddOperation());
$sum = $calc->calculate(5, 3);
$calc->setStrategy(new MultiplyOperation());
$product = $calc->calculate(5, 3);
$calc->setStrategy(new class implements OperationStrategy {
    public function execute(int $a, int $b): int {
        return $a - $b;
    }
});
$difference = $calc->calculate(5, 3);
A3
B2
C1
D4
Attempts:
2 left
💡 Hint

Count all classes implementing the OperationStrategy interface, including anonymous classes.

Practice

(1/5)
1.

What is the main purpose of the Strategy pattern in PHP?

easy
A. To allow changing the algorithm or behavior at runtime without modifying the context.
B. To create multiple instances of the same class.
C. To store data in a database efficiently.
D. To handle errors and exceptions in the code.

Solution

  1. Step 1: Understand the Strategy pattern concept

    The Strategy pattern is designed to let you swap different algorithms or behaviors easily without changing the main code that uses them.
  2. Step 2: Identify the correct purpose

    Among the options, only To allow changing the algorithm or behavior at runtime without modifying the context. describes this behavior: changing the algorithm at runtime without modifying the context class.
  3. Final Answer:

    To allow changing the algorithm or behavior at runtime without modifying the context. -> Option A
  4. Quick Check:

    Strategy pattern = change behavior easily [OK]
Hint: Strategy pattern swaps algorithms without changing main code [OK]
Common Mistakes:
  • Confusing Strategy with Singleton or Factory patterns
  • Thinking it manages data storage
  • Assuming it handles errors
2.

Which of the following is the correct way to define a strategy interface in PHP?

?
easy
A. interface Strategy { function execute() {} }
B. class Strategy { function execute() {} }
C. interface Strategy { public function execute(); }
D. abstract class Strategy { public execute(); }

Solution

  1. Step 1: Recall PHP interface syntax

    In PHP, interfaces are declared with the keyword interface, and methods inside must be declared without a body and with visibility (usually public).
  2. Step 2: Check each option

    interface Strategy { public function execute(); } correctly declares an interface with a public method without a body. class Strategy { function execute() {} } uses a class, not interface. interface Strategy { function execute() {} } incorrectly provides a method body inside interface. abstract class Strategy { public execute(); } uses abstract class but misses parentheses and visibility.
  3. Final Answer:

    interface Strategy { public function execute(); } -> Option C
  4. Quick Check:

    Interface method = declaration only [OK]
Hint: Interface methods have no body, use 'public function name();' [OK]
Common Mistakes:
  • Adding method body inside interface
  • Using class instead of interface
  • Omitting visibility keyword
3.

What will be the output of the following PHP code using the Strategy pattern?

interface Strategy {
    public function execute();
}

class AddStrategy implements Strategy {
    public function execute() {
        return 5 + 3;
    }
}

class MultiplyStrategy implements Strategy {
    public function execute() {
        return 5 * 3;
    }
}

class Context {
    private Strategy $strategy;
    public function __construct(Strategy $strategy) {
        $this->strategy = $strategy;
    }
    public function executeStrategy() {
        return $this->strategy->execute();
    }
}

$context = new Context(new MultiplyStrategy());
echo $context->executeStrategy();
medium
A. 8
B. 15
C. 53
D. Error: Cannot instantiate interface

Solution

  1. Step 1: Understand the code flow

    The code defines two strategies: AddStrategy returns 5+3=8, MultiplyStrategy returns 5*3=15. The Context class uses the strategy passed in constructor.
  2. Step 2: Identify which strategy is used

    The context is created with new MultiplyStrategy(), so calling executeStrategy() returns 15.
  3. Final Answer:

    15 -> Option B
  4. Quick Check:

    MultiplyStrategy returns 15 [OK]
Hint: Check which strategy object is passed to context [OK]
Common Mistakes:
  • Confusing AddStrategy and MultiplyStrategy output
  • Thinking interface cannot be instantiated (only concrete classes)
  • Ignoring which strategy is passed
4.

Identify the error in the following PHP code implementing the Strategy pattern:

interface Strategy {
    public function execute();
}

class ConcreteStrategy implements Strategy {
    public function execute() {
        echo "Running strategy";
    }
}

class Context {
    private $strategy;
    public function __construct(Strategy $strategy) {
        $this->strategy = $strategy;
    }
    public function executeStrategy() {
        $this->strategy->execute;
    }
}

$context = new Context(new ConcreteStrategy());
$context->executeStrategy();
medium
A. Cannot instantiate interface directly
B. Strategy interface missing method body
C. Context constructor missing type hint
D. Missing parentheses when calling execute method

Solution

  1. Step 1: Check method call syntax in Context

    Inside executeStrategy(), the code calls $this->strategy->execute; without parentheses, so the method is not actually called.
  2. Step 2: Identify correct fix

    Method calls require parentheses even if no arguments: $this->strategy->execute();.
  3. Final Answer:

    Missing parentheses when calling execute method -> Option D
  4. Quick Check:

    Method call needs () [OK]
Hint: Always use () to call methods in PHP [OK]
Common Mistakes:
  • Forgetting parentheses on method calls
  • Confusing interface method declaration with implementation
  • Ignoring type hints in constructor
5.

You want to add a new strategy SubtractStrategy to the existing PHP Strategy pattern code. Which of the following is the best way to implement it?

interface Strategy {
    public function execute(int $a, int $b): int;
}

class AddStrategy implements Strategy {
    public function execute(int $a, int $b): int {
        return $a + $b;
    }
}

// Your code here
hard
A. class SubtractStrategy implements Strategy { public function execute(int $a, int $b): int { return $a - $b; } }
B. class SubtractStrategy { public function execute(int $a, int $b): int { return $a - $b; } }
C. class SubtractStrategy implements Strategy { public function execute(int $a, int $b) { return $a - $b; } }
D. class SubtractStrategy implements Strategy { public function execute($a, $b): int { return $a - $b; } }

Solution

  1. Step 1: Check interface method signature

    The interface requires execute(int $a, int $b): int with type hints and return type.
  2. Step 2: Match method signature exactly in SubtractStrategy

    class SubtractStrategy implements Strategy { public function execute(int $a, int $b): int { return $a - $b; } } matches the interface exactly with parameter types and return type. class SubtractStrategy { public function execute(int $a, int $b): int { return $a - $b; } } misses implementing the interface. class SubtractStrategy implements Strategy { public function execute(int $a, int $b) { return $a - $b; } } misses return type. class SubtractStrategy implements Strategy { public function execute($a, $b): int { return $a - $b; } } misses parameter types.
  3. Final Answer:

    class SubtractStrategy implements Strategy { public function execute(int $a, int $b): int { return $a - $b; } } -> Option A
  4. Quick Check:

    Implement interface with exact method signature [OK]
Hint: Match interface method signature exactly when implementing [OK]
Common Mistakes:
  • Omitting interface implementation
  • Missing type hints or return types
  • Changing method signature
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard