Bird
Raised Fist0
PHPprogramming~30 mins

Intersection types in practice in PHP - Mini Project: Build & Apply

Choose your learning style10 modes available
Intersection types in practice
📖 Scenario: Imagine you are building a simple system to manage different types of workers in a company. Some workers can both code and design. You want to make sure that certain functions only accept workers who can do both tasks.
🎯 Goal: You will create interfaces for coding and designing, then create a class that implements both. Finally, you will write a function that accepts only workers who are both coders and designers using intersection types.
📋 What You'll Learn
Create two interfaces: Coder and Designer
Create a class FullStackWorker that implements both Coder and Designer
Write a function workOnProject that accepts a parameter with an intersection type of Coder&Designer
Call the workOnProject function with an instance of FullStackWorker and print the result
💡 Why This Matters
🌍 Real World
Intersection types help ensure that objects passed to functions have multiple capabilities, useful in systems where roles overlap, like full-stack developers who code and design.
💼 Career
Understanding intersection types is important for writing clear, type-safe code in modern PHP applications, improving code quality and reducing bugs.
Progress0 / 4 steps
1
Create interfaces for coding and designing
Create two interfaces called Coder and Designer. Each interface should have one public method: code() for Coder and design() for Designer. Both methods should return a string.
PHP
Hint

Use the interface keyword to create interfaces. Define methods with public visibility and specify the return type string.

2
Create a class that implements both interfaces
Create a class called FullStackWorker that implements both Coder and Designer interfaces. Implement the code() method to return the string 'Coding...' and the design() method to return the string 'Designing...'.
PHP
Hint

Use implements keyword to implement multiple interfaces. Define both methods exactly as in the interfaces.

3
Write a function using intersection types
Write a function called workOnProject that accepts one parameter called worker with the intersection type Coder&Designer. Inside the function, return the concatenation of $worker->code() and $worker->design() separated by a space.
PHP
Hint

Use the intersection type Coder&Designer in the function parameter to require both interfaces.

4
Call the function and print the result
Create an instance of FullStackWorker called worker. Call the function workOnProject with worker as argument and print the returned string.
PHP
Hint

Create the object with new FullStackWorker() and use print() to show the result.

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