Closures and variable binding with use in PHP - Time & Space Complexity
We want to understand how the time needed to run a closure with variable binding changes as the input grows.
How does the number of operations grow when using closures with variables passed by use?
Analyze the time complexity of the following code snippet.
$numbers = [1, 2, 3, 4, 5];
$sum = 0;
$addToSum = function($num) use (&$sum) {
$sum += $num;
};
foreach ($numbers as $number) {
$addToSum($number);
}
echo $sum;
This code sums all numbers in an array using a closure that accesses a variable by reference.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The
foreachloop that calls the closure for each number. - How many times: Once for each element in the
$numbersarray.
Each number in the array causes one call to the closure, which adds it to the sum.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 additions |
| 100 | 100 additions |
| 1000 | 1000 additions |
Pattern observation: The number of operations grows directly with the number of elements.
Time Complexity: O(n)
This means the time to run grows in a straight line with the number of items in the array.
[X] Wrong: "Using use inside closures makes the code slower or adds hidden loops."
[OK] Correct: The use keyword just binds variables; it does not add extra loops or slow down the code beyond the existing operations.
Understanding how closures work with variable binding helps you write clear and efficient code, a skill valued in many coding challenges and real projects.
"What if the closure was called inside a nested loop over the array? How would the time complexity change?"
Practice
use keyword do in a PHP closure?Solution
Step 1: Understand closure scope
A closure is a function inside another function that can access variables from the outside only if explicitly told.Step 2: Role of
Theuseusekeyword brings variables from the parent scope into the closure's scope so the closure can use them.Final Answer:
It imports variables from the parent scope into the closure. -> Option CQuick Check:
use = import variables [OK]
- Thinking use creates new variables inside closure
- Confusing use with global keyword
- Assuming use calls the closure
$x by reference into a closure using use?Solution
Step 1: Understand passing by reference
To allow a closure to modify an outside variable, it must be passed by reference using&.Step 2: Correct syntax with use
The correct syntax isuse (&$x)where&is before the variable name with the dollar sign.Final Answer:
function() use (&$x) { } -> Option DQuick Check:
Reference = & before $variable [OK]
- Placing & after $ or before variable name without $
- Omitting & when intending to modify variable
- Using invalid syntax like $&x
$count = 0;
$func = function() use (&$count) { $count++; echo $count; };
$func();
$func();
echo $count;
Solution
Step 1: Analyze closure calls and reference
The closure uses&$countby reference, so changes inside affect the outside variable.Step 2: Trace each call and output
First call: increments count to 1 and echoes '1'. Second call: increments count to 2 and echoes '2'. Finally, outside echo prints 2.Final Answer:
122 -> Option BQuick Check:
Reference increments count = 122 [OK]
- Assuming closure copies variable, so count stays 0
- Expecting output '111' by mistake
- Thinking code causes error
$x = 5;
$func = function() use ($x) { $x++; echo $x; };
$func();
echo $x;
Solution
Step 1: Understand variable binding without reference
Usinguse ($x)passes $x by value, so closure gets a copy.Step 2: Trace output of closure and outside variable
Closure increments its copy to 6 and echoes it. Outside $x remains 5, so echo prints 5.Final Answer:
Output will be '65' because $x inside closure is a copy. -> Option AQuick Check:
Value copy in use means outside unchanged [OK]
- Expecting outside $x to change without &
- Thinking code causes syntax or runtime error
- Confusing output order
$values = [1, 2, 3];
$sum = 0;
$funcs = [];
foreach ($values as $v) {
$funcs[] = function() use (&$sum, $v) { $sum += $v; };
}
foreach ($funcs as $f) { $f(); }
echo $sum;
Why does this output occur?
Solution
Step 1: Understand variable binding in loop closures
Each closure captures $v by value (copy) and $sum by reference.Step 2: Trace closure execution
Each closure adds its own $v (1, 2, 3) to the shared $sum. After all run, $sum = 6.Final Answer:
6, because each closure adds its own $v to $sum by value and $sum is by reference. -> Option AQuick Check:
Value copy for $v + reference $sum = 6 [OK]
- Assuming $v is shared reference causing wrong sum
- Expecting error due to $v usage
- Thinking closures do not run
Ready to prove it?
Pass the test and this pattern moves unknown
