Bird
Raised Fist0
PHPprogramming~20 mins

Closures and variable binding with use in PHP - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Closure Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of closure with variable binding by value
What is the output of this PHP code?
PHP
<?php
$number = 10;
$func = function() use ($number) {
    echo $number;
};
$number = 20;
$func();
A10
B0
C20
DError: Undefined variable
Attempts:
2 left
💡 Hint
Remember that variables passed with use are copied by value unless passed by reference.
❓ Predict Output
intermediate
2:00remaining
Output of closure with variable binding by reference
What will this PHP code output?
PHP
<?php
$value = 5;
$func = function() use (&$value) {
    $value += 10;
    echo $value;
};
$func();
echo ' ' . $value;
A5 15
BError: Cannot use variable by reference
C15 5
D15 15
Attempts:
2 left
💡 Hint
Binding by reference means changes inside the closure affect the original variable.
🔧 Debug
advanced
2:30remaining
Why does this closure not update the variable?
Consider this PHP code snippet. Why does the variable $count not increment outside the closure?
PHP
<?php
$count = 0;
$increment = function() use ($count) {
    $count++;
};
$increment();
echo $count;
ABecause $count is not initialized before use.
BBecause $count is passed by value, so increment inside closure doesn't affect outside variable.
CBecause closures cannot modify variables from outer scope.
DBecause $count is passed by reference but not incremented properly.
Attempts:
2 left
💡 Hint
Think about how variables are passed into closures with use().
❓ Predict Output
advanced
2:30remaining
Output of nested closures with variable binding
What is the output of this PHP code?
PHP
<?php
$a = 1;
$outer = function() use ($a) {
    $b = 2;
    $inner = function() use ($a, &$b) {
        $a++;
        $b++;
        echo $a . ' ' . $b;
    };
    $inner();
    echo ' ' . $b;
};
$outer();
A1 2 2
B2 3 3
C1 3 3
D2 2 2
Attempts:
2 left
💡 Hint
Remember that $a is passed by value and $b by reference in inner closure.
🧠 Conceptual
expert
3:00remaining
Why does binding by reference in closure cause unexpected behavior?
In PHP, binding a variable by reference in a closure can sometimes cause unexpected results when the variable changes after closure creation. Why does this happen?
ABecause the closure holds a reference to the original variable, so changes outside affect closure behavior dynamically.
BBecause PHP copies the variable value at closure creation, so changes outside do not affect closure.
CBecause closures cannot access variables by reference in PHP.
DBecause binding by reference causes a syntax error if variable changes later.
Attempts:
2 left
💡 Hint
Think about how references work in PHP and how closures keep references.

Practice

(1/5)
1. What does the use keyword do in a PHP closure?
easy
A. It defines a new variable inside the closure.
B. It creates a global variable accessible everywhere.
C. It imports variables from the parent scope into the closure.
D. It calls the closure immediately.

Solution

  1. Step 1: Understand closure scope

    A closure is a function inside another function that can access variables from the outside only if explicitly told.
  2. Step 2: Role of use

    The use keyword brings variables from the parent scope into the closure's scope so the closure can use them.
  3. Final Answer:

    It imports variables from the parent scope into the closure. -> Option C
  4. Quick Check:

    use = import variables [OK]
Hint: Remember: use imports outside variables into closure [OK]
Common Mistakes:
  • Thinking use creates new variables inside closure
  • Confusing use with global keyword
  • Assuming use calls the closure
2. Which of the following is the correct syntax to pass a variable $x by reference into a closure using use?
easy
A. function() use ($x) { }
B. function() use (&x) { }
C. function() use ($&x) { }
D. function() use (&$x) { }

Solution

  1. Step 1: Understand passing by reference

    To allow a closure to modify an outside variable, it must be passed by reference using &.
  2. Step 2: Correct syntax with use

    The correct syntax is use (&$x) where & is before the variable name with the dollar sign.
  3. Final Answer:

    function() use (&$x) { } -> Option D
  4. Quick Check:

    Reference = & before $variable [OK]
Hint: Use & before $var inside use to pass by reference [OK]
Common Mistakes:
  • Placing & after $ or before variable name without $
  • Omitting & when intending to modify variable
  • Using invalid syntax like $&x
3. What will be the output of this PHP code?
$count = 0;
$func = function() use (&$count) { $count++; echo $count; };
$func();
$func();
echo $count;
medium
A. 111
B. 122
C. 120
D. Error

Solution

  1. Step 1: Analyze closure calls and reference

    The closure uses &$count by reference, so changes inside affect the outside variable.
  2. 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.
  3. Final Answer:

    122 -> Option B
  4. Quick Check:

    Reference increments count = 122 [OK]
Hint: Reference in use means closure changes outside variable [OK]
Common Mistakes:
  • Assuming closure copies variable, so count stays 0
  • Expecting output '111' by mistake
  • Thinking code causes error
4. Identify the error in this PHP code snippet:
$x = 5;
$func = function() use ($x) { $x++; echo $x; };
$func();
echo $x;
medium
A. Output will be '65' because $x inside closure is a copy.
B. Runtime error because $x is undefined inside closure.
C. Syntax error because $x is not passed by reference.
D. Output will be '55' because closure does not run.

Solution

  1. Step 1: Understand variable binding without reference

    Using use ($x) passes $x by value, so closure gets a copy.
  2. 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.
  3. Final Answer:

    Output will be '65' because $x inside closure is a copy. -> Option A
  4. Quick Check:

    Value copy in use means outside unchanged [OK]
Hint: Without &, closure changes copy, not original variable [OK]
Common Mistakes:
  • Expecting outside $x to change without &
  • Thinking code causes syntax or runtime error
  • Confusing output order
5. Given this code, what will be the output?
$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?
hard
A. 6, because each closure adds its own $v to $sum by value and $sum is by reference.
B. 3, because $v is shared and only last value is added multiple times.
C. 0, because closures do not run correctly.
D. Error, because $v cannot be used without reference.

Solution

  1. Step 1: Understand variable binding in loop closures

    Each closure captures $v by value (copy) and $sum by reference.
  2. Step 2: Trace closure execution

    Each closure adds its own $v (1, 2, 3) to the shared $sum. After all run, $sum = 6.
  3. Final Answer:

    6, because each closure adds its own $v to $sum by value and $sum is by reference. -> Option A
  4. Quick Check:

    Value copy for $v + reference $sum = 6 [OK]
Hint: Use value for loop var, reference for accumulator [OK]
Common Mistakes:
  • Assuming $v is shared reference causing wrong sum
  • Expecting error due to $v usage
  • Thinking closures do not run
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