class Foo {
        public $id;

        public function __construct($id) {
                $this->id = $id;
        }
}


/* Initialize objects */
$N = 10;
$a = array();
for ($i = 0; $i < $N; ++$i) {
        $a[] = new Foo($i);
}

/* Prepare callbacks (with capture)  */
$callbacks = array();
foreach($a as $key => $object) {
	// though $object is same variable, refers to different objects
        $callbacks[$key] = function() use($object) {
                echo $object->id . "\n";
        };
}

/* Invoke callbacks */
foreach($callbacks as $callback) {
        $callback();
}

Output

0
1
2
3
4
5
6
7
8
9

The moral is: it captures the object by reference, not the actual variable.