Bird
Raised Fist0
PHPprogramming~10 mins

Intersection types in PHP - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Intersection types
Define Interfaces
↓
Create Class implementing both
↓
Use Intersection Type in Function
↓
Pass Object to Function
↓
Function accepts only if object matches ALL types
Intersection types require a value to satisfy multiple type constraints at once, like an object implementing all specified interfaces.
Execution Sample
PHP
<?php
interface A { function a(); }
interface B { function b(); }
class C implements A, B {
  function a() { echo "A"; }
  function b() { echo "B"; }
}
function test(A&B $obj) {
  $obj->a(); $obj->b();
}
$obj = new C();
test($obj);
?>
This code defines two interfaces and a class implementing both, then a function requiring an object that implements both interfaces (intersection type).
Execution Table
StepActionEvaluationResult
1Define interface Ainterface A with method a()Interface A created
2Define interface Binterface B with method b()Interface B created
3Define class C implements A and BClass C has methods a() and b()Class C created
4Create function test with parameter type A&BParameter must implement both A and BFunction test created
5Create object $obj = new C()Object $obj is instance of CObject $obj created
6Call test($obj)Check if $obj implements A and BPasses, function runs
7Inside test: call $obj->a()Calls method a()Outputs 'A'
8Inside test: call $obj->b()Calls method b()Outputs 'B'
9Function test endsAll calls successfulOutput: 'AB'
💡 Function test accepts only objects implementing both interfaces A and B; $obj meets this, so execution completes.
Variable Tracker
VariableStartAfter Step 5After Step 6Final
$objundefinedInstance of CPassed to test()Instance of C
Key Moments - 2 Insights
Why does the function parameter use A&B instead of just A or B?
Because the function requires an object that implements both interfaces A and B simultaneously, not just one. See execution_table step 4 and 6 where the intersection type enforces this.
What happens if we pass an object that implements only A or only B?
The function call will fail because the intersection type requires both. This is shown in execution_table step 6 where the check ensures the object implements both interfaces.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 6, what is checked before the function runs?
AIf $obj implements both interfaces A and B
BIf $obj implements either interface A or B
CIf $obj is a subclass of C
DIf $obj is null
💡 Hint
Check the 'Evaluation' column at step 6 in execution_table.
At which step does the program output the letter 'B'?
AStep 7
BStep 8
CStep 6
DStep 9
💡 Hint
Look at the 'Action' and 'Result' columns for output in execution_table steps 7 and 8.
If class C did not implement interface B, what would happen at step 6?
AFunction test would throw an error at step 7
BFunction test would accept $obj anyway
CFunction test would reject $obj due to missing interface B
DNothing would change
💡 Hint
Refer to the intersection type requirement in execution_table step 4 and 6.
Concept Snapshot
Intersection types in PHP require a value to satisfy multiple types at once.
Syntax: function f(A&B $obj) means $obj must implement both A and B.
Useful for enforcing multiple interface implementations.
If the object misses any type, PHP throws a TypeError.
Allows safer, clearer code contracts.
Full Transcript
This example shows how PHP intersection types work by defining two interfaces A and B, and a class C that implements both. A function test requires an argument that implements both interfaces, using the syntax A&B. When an object of class C is passed, the function calls methods from both interfaces successfully, outputting 'AB'. The execution table traces each step from defining interfaces and class, creating the object, checking the intersection type, and calling methods. Key moments clarify why both interfaces are required and what happens if an object does not meet the intersection. The visual quiz tests understanding of type checks and output steps. Intersection types help ensure objects meet multiple type requirements simultaneously, improving code safety and clarity.

Practice

(1/5)
1. What does an intersection type in PHP represent?
function example(SomeType&OtherType $param) {}
easy
A. A type that requires the value to satisfy both SomeType and OtherType.
B. A type that accepts either SomeType or OtherType.
C. A type that only accepts SomeType but ignores OtherType.
D. A type that combines SomeType and OtherType into a new class.

Solution

  1. Step 1: Understand intersection type syntax

    In PHP, the & symbol between types means the value must satisfy all listed types simultaneously.
  2. Step 2: Interpret the function parameter

    The parameter type SomeType&OtherType means the argument must be both SomeType and OtherType at the same time.
  3. Final Answer:

    A type that requires the value to satisfy both SomeType and OtherType. -> Option A
  4. Quick Check:

    Intersection type = must satisfy all types [OK]
Hint: Remember & means AND, so all types must match [OK]
Common Mistakes:
  • Confusing & with | (union type)
  • Thinking it creates a new combined class
  • Assuming it accepts either type instead of both
2. Which of the following is the correct syntax for declaring an intersection type in a function parameter in PHP?
easy
A. function test(A & B $param) {}
B. function test(A | B $param) {}
C. function test(A, B $param) {}
D. function test(A && B $param) {}

Solution

  1. Step 1: Recall intersection type syntax

    PHP uses a single ampersand & to declare intersection types between multiple types.
  2. Step 2: Check each option

    function test(A & B $param) {} uses & correctly. function test(A | B $param) {} uses | which is union type. function test(A, B $param) {} uses comma which is invalid. function test(A && B $param) {} uses && which is not valid syntax.
  3. Final Answer:

    function test(A & B $param) {} -> Option A
  4. Quick Check:

    Intersection type uses & symbol [OK]
Hint: Use single & between types for intersection [OK]
Common Mistakes:
  • Using | instead of &
  • Using commas to separate types
  • Using && instead of &
3. What will be the output of the following PHP code?
interface A { public function foo(): string; }
interface B { public function bar(): string; }

class C implements A, B {
public function foo(): string { return 'foo'; }
public function bar(): string { return 'bar'; }
}

function test(A & B $obj) {
echo $obj->foo() . ' ' . $obj->bar();
}

$c = new C();
test($c);
medium
A. TypeError at runtime
B. foo
C. bar
D. foo bar

Solution

  1. Step 1: Understand class and interfaces

    Class C implements both interfaces A and B, so it has methods foo() and bar().
  2. Step 2: Analyze function test parameter and call

    The function test requires an argument that satisfies both A and B (intersection type). Object $c satisfies both. The function echoes foo() and bar() results concatenated with a space.
  3. Final Answer:

    foo bar -> Option D
  4. Quick Check:

    Object satisfies both interfaces, prints both methods [OK]
Hint: Intersection means object must have all methods used [OK]
Common Mistakes:
  • Expecting only one method output
  • Thinking it causes a TypeError
  • Confusing intersection with union types
4. Identify the error in this PHP code using intersection types:
interface X { public function x(): void; }
interface Y { public function y(): void; }

class Z implements X {
public function x(): void {}
}

function foo(X & Y $param) {
$param->x();
$param->y();
}

$z = new Z();
foo($z);
medium
A. Function foo has wrong parameter syntax for intersection types.
B. Method y() is missing in function foo.
C. Class Z does not implement interface Y, so it cannot satisfy X & Y.
D. No error, code runs fine.

Solution

  1. Step 1: Check class Z implementation

    Class Z implements only interface X, not Y, so it does not satisfy the intersection type X & Y.
  2. Step 2: Analyze function call with $z

    Function foo requires a parameter that implements both X and Y. Passing $z causes a TypeError because $z lacks Y.
  3. Final Answer:

    Class Z does not implement interface Y, so it cannot satisfy X & Y. -> Option C
  4. Quick Check:

    Intersection requires all interfaces implemented [OK]
Hint: Check all interfaces are implemented for intersection [OK]
Common Mistakes:
  • Assuming partial interface implementation is enough
  • Thinking syntax is wrong instead of logic
  • Ignoring missing methods from interfaces
5. Given these interfaces and classes:
interface Logger { public function log(string $msg): void; }
interface FileWriter { public function write(string $data): void; }

class FileLogger implements Logger, FileWriter {
public function log(string $msg): void { echo "Log: $msg\n"; }
public function write(string $data): void { echo "Write: $data\n"; }
}

function process(Logger & FileWriter $obj, string $message) {
$obj->log($message);
$obj->write($message);
}

$fl = new FileLogger();
process($fl, "Hello World");

What will be the output and why is intersection type useful here?
hard
A. Runtime error because intersection types cannot be used with classes.
B. Output:
Log: Hello World
Write: Hello World
Intersection ensures $obj has both log() and write() methods.
C. Output:
Log: Hello World
Only log() is called because intersection ignores write().
D. Output:
Write: Hello World
Only write() is called because log() is ignored.

Solution

  1. Step 1: Understand class and interfaces

    FileLogger implements both Logger and FileWriter, so it has both log() and write() methods.
  2. Step 2: Analyze function process behavior

    The function requires an object that satisfies both Logger and FileWriter (intersection type). It calls both log() and write() methods on the object.
  3. Step 3: Predict output

    Calling process with $fl outputs:
    Log: Hello World
    Write: Hello World
  4. Final Answer:

    Output:
    Log: Hello World
    Write: Hello World
    Intersection ensures $obj has both log() and write() methods.
    -> Option B
  5. Quick Check:

    Intersection type ensures all required methods exist [OK]
Hint: Intersection guarantees all methods exist on object [OK]
Common Mistakes:
  • Thinking only one interface method is called
  • Believing intersection types cause runtime errors
  • Ignoring that both methods are called
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