Intersection types in practice in PHP - Time & Space Complexity
Let's see how using intersection types affects the time it takes for PHP code to run.
We want to know how the program's work grows when input changes.
Analyze the time complexity of the following code snippet.
interface Logger {
public function log(string $msg): void;
}
interface FileWriter {
public function write(string $data): void;
}
function saveAndLog(FileWriter&Logger $obj, string $data): void {
$obj->write($data);
$obj->log("Data saved");
}
// Assume $obj implements both interfaces
saveAndLog($obj, "Hello World");
This code uses an intersection type to require an object that can both write files and log messages.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Two method calls on the same object.
- How many times: Exactly twice per function call.
Each time we call the function, it does two actions regardless of input size.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 2 |
| 100 | 2 |
| 1000 | 2 |
Pattern observation: Operations remain constant regardless of input size.
Time Complexity: O(1)
This means the time remains constant regardless of input size.
[X] Wrong: "Using intersection types makes the code slower because it checks multiple interfaces at once."
[OK] Correct: Intersection types are a compile-time check and do not add extra work when the program runs.
Understanding how type checks affect performance helps you write clear and efficient code, a skill valued in many coding challenges.
"What if the function called a method inside a loop over a large array? How would the time complexity change?"
Practice
A&B mean in PHP?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
The value must be both type A and type B simultaneously.A&BFinal Answer:
The value must satisfy both type A and type B simultaneously. -> Option CQuick Check:
Intersection means AND, so both types required [OK]
- Confusing intersection (&) with union (|)
- Thinking it means either type A or B
- Assuming it means only one type
Countable and Iterator?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) {} usesCountable&Iteratorwhich is correct syntax for intersection types in PHP.Final Answer:
function process(Countable&Iterator $obj) {} -> Option AQuick Check:
Intersection uses & without spaces [OK]
- Using | instead of & for intersection
- Adding spaces around &
- Using comma instead of &
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);Solution
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 AQuick Check:
Object meets both interfaces, so output is 'foo bar' [OK]
- Expecting only one method output
- Thinking intersection causes error if both interfaces implemented
- Confusing union with intersection types
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);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 BQuick Check:
Intersection requires all interfaces, missing one causes TypeError [OK]
- Assuming partial interface implementation is enough
- Confusing syntax error with type error
- Thinking missing method causes fatal error instead of TypeError
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+?Solution
Step 1: Understand intersection type usage
Use&to require both JsonSerializable and Countable interfaces.Step 2: Handle custom method not in interfaces
SincecustomMethod()is not part of these interfaces, check its existence withmethod_existsbefore calling.Final Answer:
function process(JsonSerializable&Countable $obj) { if (method_exists($obj, 'customMethod')) { $obj->customMethod(); } } -> Option DQuick Check:
Intersection + runtime check for extra method [OK]
- Using union (|) instead of intersection (&)
- Assuming method in interfaces without checking
- Ignoring type safety by using object without interfaces
Ready to prove it?
Pass the test and this pattern moves unknown
