Clases parciales en PHP

10 de septiembre de 2008

Las posibilidad de escribir el código de una misma clase en varios ficheros es una de las características que ofrece C# desde la versión 2.0 del .NET Framework. Esta práctica tiene sus pros y sus contras. Al usar clases parciales se corre el riesgo de tener el código de una clase repartido por todo el proyecto, siendo dificil de programar y mantener el código, e incluso se puede dar lugar a problemas de seguridad.

Pero supongamos que somos programadores con experiencia (¿?), y que vamos a  mantener nuestro código muy ordenado y seguro. ¿Qué ventajas nos ofrece este sistema? Varias, y quizá la más importantes es la posibilidad de integrar en nuestra aplicación clases generadas automáticamente por herramientas de generación de código, y enriquecerlas sin correr el riesgo de perder nuestro trabajo cuando sea necesario generarlas de nuevo. La generación de código se utiliza mucho para la creación automática de entidades de datos, dentro de frameworks de persistencia. Generamos una clase por cada entidad de la base de datos, y el código de cada clase es almacenado en un fichero. Si queremos añadir algún método a nuestra clase no debemos modificar el fichero generado, ya que  será sobreescrito si se vuelve a generar el código. Usando clases parciales tendremos un fichero adicional por cada clase generada, donde podremos escribir nuestro código sin correr riesgos.

PHP no soporta de forma nativa clases parciales. Sin embargo, no todo está perdido. PHP5 dispone de una colección de métodos “mágicos” (__set, __get y __call) que pueden ayudarnos a emular este comportamiento. En el blog Tower Of Power podemos ver un artículo con  ejemplos de cómo emular las clases parciales.

MyGeneration incluye una plantilla de generación de código para PHP, que es bastante fácil de modificar para incluir clases parciales. Particularmente, nosotros hemos incluido en el framework de MyGeneration un patrón Builder, en el cual hemos utilizado clases parciales.

PD: El  mismo comportamiento se puede emular utilizando herencia, pero entonces no hay reto 🙂

  • qrcode link