Hmm.. Lo último me confundió un poco, sí que soy un joven padawan
Bueno, trataré de explicar a ver si me doy a entender:
En el primero la función con use() accede a la variable que debería ser declarada antes de ésta, pero como está declarada después, tira error de undefined variable (variable no definida)
En la segunda función es parecido: Como la variable debe ser definida antes de la declaración de la función, no se toma en cuenta a Puerto Rico porque está después
En la tercera función es igual pero se usan objetos
En la cuarta función, antes de ésta se crea un objeto y se declara la función, pero luego se asigna un valor al objeto (Puerto Rico) para después llamar a la función que tiene que acceder al valor asignado (Puerto Rico). Para explicar mejor, el proceso sería:
1- Creo un objeto
2- Declaro una función
3- Le asigno un valor al objeto
4- El objeto creado antes de la función ahora contiene el valor asignado
5- Se ejecuta la función accesando al valor asignado al objeto creado
Para terminar, el código correcto debería ser:
Código PHP:
<?php
$country = 'Puerto Rico';
$fn = function () use ($country) { echo $country . "<br />"; };
$fn();
$country = 'Puerto Rico';
$fn = function () use ($country) { echo $country . "<br />"; };
$fn();
$country = (object)array('name' => 'Puerto Rico');
$fn = function () use ($country) { echo $country->name . "<br />"; };
$fn();
$country = (object)array('name' => 'Europa');
$fn = function () use ($country) { echo $country->name . "<br />"; };
$country->name = 'Puerto Rico';
$fn();