Bird
Raised Fist0
PHPprogramming~5 mins

Intersection types in practice in PHP

Choose your learning style10 modes available
Introduction

Intersection types let you say a value must follow multiple rules at the same time. This helps catch mistakes early and makes your code clearer.

When a function needs an object that has features from two or more different interfaces.
When you want to be sure a variable meets several type requirements before using it.
When combining traits or behaviors that must all be present in one object.
When you want to enforce strict type checks in your code for better safety.
Syntax
PHP
function exampleFunction(SomeInterface&AnotherInterface $param): void {
    // function body
}

Use the ampersand (&) to combine types.

The value must satisfy all types listed.

Examples
This function requires an object that can both log messages and write to a file.
PHP
<?php
interface Logger {
    public function log(string $msg): void;
}

interface FileWriter {
    public function writeToFile(string $data): void;
}

function saveAndLog(Logger&FileWriter $obj, string $data): void {
    $obj->writeToFile($data);
    $obj->log('Data saved');
}
MyClass implements both interfaces, so it can be passed to the function.
PHP
<?php
class MyClass implements Logger, FileWriter {
    public function log(string $msg): void {
        echo "Log: $msg\n";
    }
    public function writeToFile(string $data): void {
        echo "Writing: $data\n";
    }
}

$obj = new MyClass();
saveAndLog($obj, 'Hello');
Sample Program

This program shows a Duck that can both fly and swim. The function moveAnimal requires an object that can do both, so it calls both methods.

PHP
<?php
interface CanFly {
    public function fly(): void;
}

interface CanSwim {
    public function swim(): void;
}

class Duck implements CanFly, CanSwim {
    public function fly(): void {
        echo "Duck is flying\n";
    }
    public function swim(): void {
        echo "Duck is swimming\n";
    }
}

function moveAnimal(CanFly&CanSwim $animal): void {
    $animal->fly();
    $animal->swim();
}

$duck = new Duck();
moveAnimal($duck);
OutputSuccess
Important Notes

Intersection types require PHP 8.1 or higher.

If the object does not implement all interfaces, PHP will give a type error.

Summary

Intersection types combine multiple type requirements using &.

They ensure a value meets all listed types.

Useful for functions needing objects with multiple capabilities.

Practice

(1/5)
1. What does an intersection type like A&B mean in PHP?
easy
A. The value must be type B only.
B. The value can be either type A or type B.
C. The value must satisfy both type A and type B simultaneously.
D. The value must be type A only.

Solution

  1. Step 1: Understand intersection type concept

    Intersection types require a value to meet all listed types at once, not just one.
  2. Step 2: Apply to A&B

    The value must be both type A and type B simultaneously.
  3. Final Answer:

    The value must satisfy both type A and type B simultaneously. -> Option C
  4. Quick Check:

    Intersection means AND, so both types required [OK]
Hint: Intersection means all types must be met together [OK]
Common Mistakes:
  • Confusing intersection (&) with union (|)
  • Thinking it means either type A or B
  • Assuming it means only one type
2. Which of the following is the correct syntax for declaring a function parameter with an intersection type of interfaces Countable and Iterator?
easy
A. function process(Countable&Iterator $obj) {}
B. function process(Countable|Iterator $obj) {}
C. function process(Countable, Iterator $obj) {}
D. function process(Countable & Iterator $obj) {}

Solution

  1. Step 1: Recall intersection type syntax in PHP

    PHP uses the ampersand (&) without spaces and escaped as & in HTML to declare intersection types.
  2. Step 2: Check each option

    function process(Countable&Iterator $obj) {} uses Countable&Iterator which is correct syntax for intersection types in PHP.
  3. Final Answer:

    function process(Countable&Iterator $obj) {} -> Option A
  4. Quick Check:

    Intersection uses & without spaces [OK]
Hint: Use & with no spaces for intersection types [OK]
Common Mistakes:
  • Using | instead of & for intersection
  • Adding spaces around &
  • Using comma instead of &
3. Given the following code, what will be the output?
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. foo bar
B. foo
C. bar
D. TypeError at runtime

Solution

  1. Step 1: Understand class C implements both interfaces

    Class C implements both A and B, so it has methods foo() and bar().
  2. Step 2: Call test with intersection type parameter

    Function test requires an object that is both A and B, which $c is. It calls foo() and bar() and echoes their results separated by space.
  3. Final Answer:

    foo bar -> Option A
  4. Quick Check:

    Object meets both interfaces, so output is 'foo bar' [OK]
Hint: Check if object implements all interfaces in intersection [OK]
Common Mistakes:
  • Expecting only one method output
  • Thinking intersection causes error if both interfaces implemented
  • Confusing union with intersection types
4. What is the error in this code snippet?
interface X { public function x(): void; }
interface Y { public function y(): void; }

function example(X&Y $obj) {
$obj->x();
$obj->y();
}

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

$z = new Z();
example($z);
medium
A. No error, code runs fine.
B. TypeError because $z does not implement interface Y.
C. Syntax error in function declaration.
D. Fatal error: method y() not found in class Z.

Solution

  1. Step 1: Check class Z interfaces

    Class Z implements only interface X, not Y.
  2. Step 2: Analyze function parameter type

    Function example requires an object implementing both X and Y (intersection). Passing $z violates this.
  3. Final Answer:

    TypeError because $z does not implement interface Y. -> Option B
  4. Quick Check:

    Intersection requires all interfaces, missing one causes TypeError [OK]
Hint: All interfaces in intersection must be implemented [OK]
Common Mistakes:
  • Assuming partial interface implementation is enough
  • Confusing syntax error with type error
  • Thinking missing method causes fatal error instead of TypeError
5. You want to write a function that accepts an object which must be both JsonSerializable and Countable. You also want to ensure the object has a method customMethod(). Which of the following is the best way to type hint this in PHP 8.1+?
hard
A. function process(JsonSerializable|Countable $obj) { $obj->customMethod(); }
B. function process(JsonSerializable&Countable&CustomInterface $obj) {}
C. function process(object $obj) { $obj->customMethod(); }
D. function process(JsonSerializable&Countable $obj) { if (method_exists($obj, 'customMethod')) { $obj->customMethod(); } }

Solution

  1. Step 1: Understand intersection type usage

    Use & to require both JsonSerializable and Countable interfaces.
  2. Step 2: Handle custom method not in interfaces

    Since customMethod() is not part of these interfaces, check its existence with method_exists before calling.
  3. Final Answer:

    function process(JsonSerializable&Countable $obj) { if (method_exists($obj, 'customMethod')) { $obj->customMethod(); } } -> Option D
  4. Quick Check:

    Intersection + runtime check for extra method [OK]
Hint: Use & for interfaces and method_exists for extra methods [OK]
Common Mistakes:
  • Using union (|) instead of intersection (&)
  • Assuming method in interfaces without checking
  • Ignoring type safety by using object without interfaces
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