miércoles, 19 de marzo de 2008

Primer liberación del Yupp Framework

Esta liberación de código del Yupp Framework está relacionada con uno de los componentes principales del mismo, el YORM. Este componente se encarga de manejar todo el acceso a datos, definición de modelos y generación de esquemas, en una forma 100% orientada a objetos, simplificando las tareas en dichas áreas.

Hoy con la versión 0.1 de este componente se inicia un largo camino para este framework que espera y apunta a ser el más simple y productivo del mercado (en frameworks PHP, claro está).

En esta primer versión encontramos una primer solución para definir clases del modelo, generar esquemas, persistir datos y obtener datos, sin necesidad de codificar una sola línea de SQL y con una configuración mínima (apenas los datos de conexión a la base). Esta versión cuenta con soporte para definición del modelo de datos, soporte de relaciones de herencia y relaciones entre clases con cardinalidades 1-1, 1-n y n-n unidireccionales o bidireccionales.

Aquí está es link para descargar esta versión.

Problemas al acceder al nombre de la clase en un esquema de herencia desde metodos estaticos en PHP

Digamos que tenemos un esquema como el siguiente, en donde hay dos clases que mantienen una relación de herencia, y hay un método estático definido en la clase padre, el cual accede al nombre de la clase y es invocado por la clase hija. El resultado esperado sería que el nombre de la clase fuera el de la clase hija, pero como veremos en el ejemplo, el resultado es la clase padre.
class A {
public static function
who() {
echo
__CLASS__;
}
public static function
test() {
self::who();
}
}

class
B extends A {
public static function
who() {
echo
__CLASS__;
}
}

B::test();

Lo descrito anteriormente sucede porque PHP resuelve el nombre de la clase por la clase a la cual pertenece el método que se está invocando, lo que tal vez se puede ver como una violación al polimorfismo, es decir, que esperamos que el código anterior devuelva el nombre de la clase sobre la cual es invocado el método, pero no es así.

Según el manual de PHP, con la versión 5.3.0 este tema será resuelto de forma nativa por PHP, la solución a este problema lleva el nombre de "Late Static Bindings". Lo que básicamente agrega esta solución es una palabra clave que ayuda a referenciar a la clase correcta en tiempo de ejecución conservando el comportamiento deseado en un ambiente Orientado a Objetos con polimorfismo. Este es el ejemplo que se ofrece en la documentación de PHP:

class A {
public static function
who() {
echo
__CLASS__;
}
public static function
test() {
static::
who(); // Here comes Late Static Bindings
}
}

class
B extends A {
public static function
who() {
echo
__CLASS__;
}
}

B::test();


En este ejemplo se agrega la palabra clave "static" para referenciar a la clase correcta en tiempo de ejecución, devolviendo el valor correcto y esperado para un ambiente que soporta polimorfismo.

Por más información sobre el tema, accede al manual de PHP - Late Static Bindings.