Reflection es una clase o más bien un conjunto de clases de PHP que permiten saber todo sobre tus otras clases, métodos, funciones, parametros, etcétera... Quizás es una de las funcionalidades más c00l
que PHP ha agregado recientemente y quizás una de las que menos se conoce o se usa: ReflectionMethod.
Por acá les dejo un código que me pareció bastante práctico y su siguiente explicación:
Supongamos que necesitan llamar a un método de una clase (un controlador o algo así) usando call_user_func_array desde alguna parte de nuestro script, pero antes de llamarlo directamente, quieren validar que:
- El método a llamar sea público
- La cantidad de parámetros enviados no es menor que la cantidad de parámetros requeridos por el método.
Y adicionalmente les gustaría no sólo pasar los parámetros como parámetros ordinarios, sino también tenerlos disponibles en una clase aparte, es decir, que al llamar a una función como:
Código :
function verLista($year, $month)
Con los siguientes valores:
Código :
call_user_func_array(array($controller, 'verLista'), array(2008, 10));
Permita generar en el Controller un objeto con los siguientes valores:
Código :
$this->params->year = 2008; $this->params->month = 10;
Lo cual tal vez sería util si más adelante se necesita pasar estos valores de un método a otro dentro del controlador sin necesidad del uso de parámetros y si se quiere agregar una seguridad extra al script (como bloquear la posibilidad de sobreescribir o reemplazar parametros)
En fin, esta es la idea.. Aquí el código:
Primeramente tenemos una clase básica llamada ControllerParams que permite guardar y obtener datos / parámetros:
Código :
class ControllerParams
{
private $params = array();
function __set($name, $value)
{
$this->params[$name] = $value;
}
function __get($name)
{
return $this->params[$name];
}
}
Y aquí el método que hace la funcionalidad ya descripta:
Código :
class Controller
{
protected $params = null;
final function execute($action, $params = null) //funcion intermedia
{
$reflectionMethod = new ReflectionMethod($this, $action); //se crea una instancia de ReflectionMethod con la referencia al metodo que necesitamos llamar
//asi ya tenemos disponible las funcionalidades de ReflectionMethod:
if(($action == 'execute') || !$reflectionMethod->isPublic() || (count($params) < $reflectionMethod->getNumberOfRequiredParameters()))
{
//LANZAR ERROR
}
$parametros = $reflectionMethod->getParameters(); //con esto obtenemos los parametros de nuestro metodo
$this->params = new ControllerParams();
foreach($parameters as $key => $parameter) //y hacemos un ciclo con ellos
{
$name = $parameter->getName(); //obtenemos el nombre
if(isset($params[$key])) //si el usuario mandó algun valor lo asignamos
{
$this->params->$name = $params[$key];
}
else
{
$this->params->$name = $parameter->getDefaultValue(); //sino tambien podemos tomar el valor por defecto
}
}
call_user_func_array(array(&$this, $action), $params); //y por ultimo hacemos el llamado de costumbre
}
}
Nótese que los parametros son también objetos con funcionalidades
Espero que el código o la explicación le sirva a alguien y no hubiese sido preferible usar el tiempo viendo alguna serie mala en sony

Duilio :
Código :
harias algo como
Código :
$controller = new Controller; $controller->execute('verLista', array(2008, 10));y bueno, el haría lo que ya comenté...
Es útil para un Framework o cualquier función que el usuario (quien navega la página) pueda llamar...
Por ejemplo si tienes una pagina http://www.pagina.com.ve/noticias/ver-lista/2008/10... y usas mod rewrite y todo eso para al final saber que el usuario quiere "ver la lista" de noticias del 2008 y 10 pero quieres asegurarte que de verdad está llamando la página correctamente, sería muy útil...
Lo malo es que para esto necesitaría postear un htaccess y una clase que lea la URL y separe las acciones de los parametros etc jeje...
Pero bueno es mi primer tip
See ya