Bird
Raised Fist0
PHPprogramming~10 mins

Closures as callbacks in PHP - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Closures as callbacks
Define Closure
↓
Pass Closure as Callback
↓
Function Calls Callback
↓
Closure Executes
↓
Return Result or Side Effect
↓
End
This flow shows how a closure (a function without a name) is defined, passed as a callback to another function, then called and executed inside that function.
Execution Sample
PHP
<?php
$greet = function($name) {
    return "Hello, $name!";
};

function welcome($callback, $user) {
    echo $callback($user);
}

welcome($greet, "Alice");
This code defines a closure that greets a user, then passes it as a callback to a function that calls it and prints the greeting.
Execution Table
StepActionEvaluationResult
1Define closure $greetClosure createdFunction stored in $greet
2Define function welcomeFunction createdFunction ready to use
3Call welcome($greet, "Alice")welcome called with closure and 'Alice'Execution enters welcome
4Inside welcome: call $callback('Alice')Calls closure with 'Alice'Returns 'Hello, Alice!'
5echo outputPrints 'Hello, Alice!'Output: Hello, Alice!
6welcome endsFunction returns voidProgram ends
💡 welcome function finishes after calling the closure and printing the greeting
Variable Tracker
VariableStartAfter Step 1After Step 3After Step 4Final
$greetundefinedClosure functionClosure functionClosure functionClosure function
$callbackundefinedundefinedClosure functionClosure functionClosure function
$userundefinedundefined"Alice""Alice""Alice"
Key Moments - 3 Insights
Why can we call $callback($user) inside the welcome function?
Because $callback holds the closure function passed as an argument, so calling $callback($user) runs that closure with the given user.
Is the closure $greet executed when it is defined?
No, the closure is only created and stored in $greet. It runs later when welcome calls it at step 4.
What does echo inside welcome print?
It prints the string returned by the closure, which is 'Hello, Alice!' as shown in step 5.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of $callback at step 4?
AUndefined
BString 'Alice'
CClosure function
DInteger 0
💡 Hint
Check the 'Evaluation' and 'Result' columns at step 4 in the execution table.
At which step does the program print the greeting message?
AStep 5
BStep 3
CStep 4
DStep 6
💡 Hint
Look for the 'echo output' action in the execution table.
If we changed welcome to call $callback with 'Bob' instead of $user, what would change in the variable tracker?
AThe value of $user would change to 'Bob'
BThe value passed to $callback would be 'Bob', but $user stays 'Alice'
CNothing changes anywhere
DThe closure $greet would change
💡 Hint
Check how $user and $callback are tracked separately in the variable tracker.
Concept Snapshot
Closures as callbacks in PHP:
- Define a closure: $fn = function($x) { ... };
- Pass closure as argument to a function
- Call closure inside function: $callback($arg)
- Closure runs with passed argument
- Useful for flexible, reusable code
Full Transcript
This example shows how to use closures as callbacks in PHP. First, a closure is defined and stored in a variable. Then, a function is defined that accepts a callback and a user name. When the function is called with the closure and a user name, it calls the closure with the user name and prints the greeting. The execution table traces each step, showing how variables change and when the closure runs. Key moments clarify common confusions about when the closure executes and how it is called. The quiz tests understanding of variable values and output timing. This helps beginners see how closures can be passed and used as callbacks in PHP.

Practice

(1/5)
1. What is a closure in PHP when used as a callback?
easy
A. A special variable type for storing data
B. A named function that cannot access outside variables
C. An anonymous function that can be passed as an argument
D. A PHP keyword for ending loops

Solution

  1. Step 1: Understand what a closure is

    A closure is an anonymous function, meaning it has no name and can be created on the fly.
  2. Step 2: Recognize closures as callbacks

    Closures can be passed as arguments to other functions to customize behavior, making them useful as callbacks.
  3. Final Answer:

    An anonymous function that can be passed as an argument -> Option C
  4. Quick Check:

    Closure = anonymous function callback [OK]
Hint: Closures are nameless functions passed as arguments [OK]
Common Mistakes:
  • Thinking closures must have names
  • Confusing closures with variables
  • Believing closures cannot be passed as arguments
2. Which of the following is the correct syntax to define a closure as a callback in PHP?
easy
A. array_map(function $x { return $x * 2; }, [1, 2, 3]);
B. array_map(function($x) { $x * 2; }, [1, 2, 3]);
C. array_map(function => $x * 2, [1, 2, 3]);
D. array_map(function($x) { return $x * 2; }, [1, 2, 3]);

Solution

  1. Step 1: Check closure syntax

    The correct syntax for an anonymous function uses the keyword function followed by parentheses with parameters, then braces with the function body.
  2. Step 2: Validate the return statement

    The closure must explicitly return the value to be used by array_map. array_map(function($x) { return $x * 2; }, [1, 2, 3]); correctly returns $x * 2.
  3. Final Answer:

    array_map(function($x) { return $x * 2; }, [1, 2, 3]); -> Option D
  4. Quick Check:

    Correct closure syntax = array_map(function($x) { return $x * 2; }, [1, 2, 3]); [OK]
Hint: Use function($param) { return value; } for closures [OK]
Common Mistakes:
  • Omitting parentheses around parameters
  • Missing return keyword inside closure
  • Using arrow (=>) incorrectly in closure
3. What will be the output of the following PHP code?
$numbers = [1, 2, 3];
$result = array_map(function($n) { return $n + 5; }, $numbers);
print_r($result);
medium
A. Array (1, 2, 3, 5)
B. [6, 7, 8]
C. [5, 6, 7]
D. [1, 2, 3]

Solution

  1. Step 1: Understand array_map with closure

    The closure adds 5 to each element of the array $numbers.
  2. Step 2: Calculate each element

    1+5=6, 2+5=7, 3+5=8, so the resulting array is [6, 7, 8].
  3. Final Answer:

    [6, 7, 8] -> Option B
  4. Quick Check:

    Each element + 5 = [6,7,8] [OK]
Hint: array_map applies closure to each element [OK]
Common Mistakes:
  • Confusing original array with result
  • Forgetting closure return value
  • Misreading array_map behavior
4. Identify the error in this PHP code using a closure as a callback:
$multiplier = 3;
$numbers = [1, 2, 3];
$result = array_map(function($n) { return $n * $multiplier; }, $numbers);
print_r($result);
medium
A. The variable $multiplier is not accessible inside the closure
B. array_map cannot accept closures as callbacks
C. Missing semicolon after array_map call
D. The closure must be named to access external variables

Solution

  1. Step 1: Check variable scope inside closure

    Variables outside a closure are not accessible inside unless passed with use.
  2. Step 2: Identify missing use keyword

    The closure needs use ($multiplier) to access the external variable.
  3. Final Answer:

    The variable $multiplier is not accessible inside the closure -> Option A
  4. Quick Check:

    External vars need use() in closures [OK]
Hint: Use 'use' to access outside variables in closures [OK]
Common Mistakes:
  • Assuming closures access all outside variables automatically
  • Thinking closures must be named to access variables
  • Believing array_map rejects closures
5. How can you modify this PHP code to correctly multiply each number by an external variable using a closure as a callback?
$factor = 4;
$nums = [2, 4, 6];
$results = array_map(function($num) { return $num * $factor; }, $nums);
print_r($results);
hard
A. Add use ($factor) after the function parentheses
B. Declare $factor as global inside the closure
C. Pass $factor as a second argument to array_map
D. Replace closure with a named function

Solution

  1. Step 1: Understand variable scope in closures

    To access an external variable inside a closure, you must explicitly import it using use.
  2. Step 2: Apply use ($factor) syntax

    Modify the closure to function($num) use ($factor) { return $num * $factor; } to access $factor.
  3. Final Answer:

    Add use ($factor) after the function parentheses -> Option A
  4. Quick Check:

    use() imports external vars into closures [OK]
Hint: Use 'use' keyword to bring external variables inside closures [OK]
Common Mistakes:
  • Trying to access external variables without use()
  • Using global keyword inside closures incorrectly
  • Passing extra arguments to array_map
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