So I\'m programming along in a nice, up to date, object oriented fashion. I regularly make use of the various aspects of OOP that PHP implements but I am wondering when might I
Here are examples for closures in php
// Author: HishamDalal@gamil.com
// Publish on: 2017-08-28
class users
{
    private $users = null;
    private $i = 5;
    function __construct(){
        // Get users from database
        $this->users = array('a', 'b', 'c', 'd', 'e', 'f');
    }
    function displayUsers($callback){
        for($n=0; $n<=$this->i; $n++){
            echo  $callback($this->users[$n], $n);
        }
    }
    function showUsers($callback){
        return $callback($this->users);
    }
    function getUserByID($id, $callback){
        $user = isset($this->users[$id]) ? $this->users[$id] : null;
        return $callback($user);
    }
}
$u = new users();
$u->displayUsers(function($username, $userID){
    echo "$userID -> $username<br>";
});
$u->showUsers(function($users){
    foreach($users as $user){
        echo strtoupper($user).' ';
    }
});
$x = $u->getUserByID(2, function($user){
    return "<h1>$user</h1>";
});
echo ($x);
Output:
0 -> a
1 -> b
2 -> c
3 -> d
4 -> e
5 -> f
A B C D E F 
c
Closures:
MDN has the best explanation IMO:
A closure is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment). In other words, a closure gives you access to an outer function’s scope from an inner function.
i.e. A closure is a function with access to the variables which are in the parent scope. A closure allows us to conveniently create functions on the fly since in some situations a functions is only needed in one place (callbacks, callable arguments).
Example:
$arr = [1,2,3,3];
$outersScopeNr = 2;
// The second arg in array_filter is a closure
// It would be inconvenient to have this function in global namespace
// The use keyword lets us access a variable in an outer scope
$newArr = array_filter($arr, function ($el) use ($outersScopeNr) {
    return $el === 3 || $el === $outersScopeNr;
});
var_dump($newArr);
// array (size=3)
//  1 => int 2
//  2 => int 3
//  3 => int 3