📖 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
Step 1: Understand intersection type concept
Intersection types require a value to meet all listed types at once, not just one.
Step 2: Apply to A&B
The value must be both type A and type B simultaneously.
Final Answer:
The value must satisfy both type A and type B simultaneously. -> Option C
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
Step 1: Recall intersection type syntax in PHP
PHP uses the ampersand (&) without spaces and escaped as & in HTML to declare intersection types.
Step 2: Check each option
function process(Countable&Iterator $obj) {} uses Countable&Iterator which is correct syntax for intersection types in PHP.
Final Answer:
function process(Countable&Iterator $obj) {} -> Option A
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'; } }
Step 1: Understand class C implements both interfaces
Class C implements both A and B, so it has methods foo() and bar().
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.
Final Answer:
foo bar -> Option A
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
Step 1: Check class Z interfaces
Class Z implements only interface X, not Y.
Step 2: Analyze function parameter type
Function example requires an object implementing both X and Y (intersection). Passing $z violates this.
Final Answer:
TypeError because $z does not implement interface Y. -> Option B
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
Step 1: Understand intersection type usage
Use & to require both JsonSerializable and Countable interfaces.
Step 2: Handle custom method not in interfaces
Since customMethod() is not part of these interfaces, check its existence with method_exists before calling.
Final Answer:
function process(JsonSerializable&Countable $obj) { if (method_exists($obj, 'customMethod')) { $obj->customMethod(); } } -> Option D
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 unknownstrongwhile earning +1 Grip toward your certificate.