Bue.... es un tema largo y árido... y espero que no polémico (hay un libro por cada maestro
)
Ya he tratado el tema cuando en algún momento pregunté que pasaba con los "namespace" que estaban en las betas y hasta en las presentaciones de lo que iba a venir con PHP5, pero que finalmente no aparecieron.
Todo se resume que al carecer de una sintaxis como "namespace" (idem a .Net) o "package" (idem a Java) no se puede traducir directamente el correspondiente elemento UML (el "paquete") de forma directa en PHP5.
Visto de otra forma, ahora, para implementar algo del tipo "n capas", todo se convierte en un problema de manejo de subdirectorios y "llamadas relativas", buscando evitar llamadas del tipo "../" (que son dependientes de donde se están invocando y pueden devolver cualquier cosa).
Lo que internamente sucede, por ejemplo en Java, cuando creas un paquete se crea internamente una carpeta/subdirectorio. Por lo pronto, esto es igual si lo quieres hacer en PHP.
- dominio
- persistencia
- presentacion
El punto es, luego, como resolver las invocaciones que puedes hacer dentro de cada "paquete" y no tener problemas de hacerlo desde cualquier ubicación.
Parches posibles: crear un archivo de configuración en la raíz del proyecto, y por cada paquete, un archivo local que apunte al de la raíz, y cada clase del paquete usa su archivo local. Puedes intentar definir constantes que apuntes a cada capa, para luego invocarlas de cualquier lado:
Código PHP:
// Archivo de configuración: 3 capas
define('DOM', APP."/dominio");
define('PRE', APP."/presentacion");
define('PER', APP."/persistencia");
Como lo invocaría:
Código PHP:
require_once 'configuracion.php';
require_once(DOM."/DominioFachada.class.php");
require_once(PRE."/PresentacionFachada.class.php");
PresentacionFachada::listarUsuarios(DominioFachada::traerUsuarios());
Lo malo, al no tener algo del tipo "package" o "namespace", no puedes ni invocar enteramente un "paquete", ni hacer referencias puntuales a un elemento nombrando al paquete como partida, ejemplo:
Código PHP:
// Invoco ambos paquetes completos
import dominio;
import presentacion;
Código PHP:
// Invoco un elemento a partir del paquete
dominio.DominioFachada::traerUsuarios();
Lo más prolijo, pasar a un modelo modular, donde al entrar siempre por el mismo lugar pueden definir el archivo de configuración en un solo lado y no tener que obligar que cada parte invoque al suyo.
Le evolución del modelo "web modular" sería pasar a un patrón MVC, que a los efectos sería casi lo mismo que separarlo en 3 capas con responsabilidades distintas.
Resumiendo: no es tan trivial implementar algo de esto (no lo hubieran sacado entonces de la beta de PHP5), pero bien podrían incluirlo en PHP6 (pero no va a suceder), lo cual en mi humilde opinión es grave y problemático (algo que el lenguaje debería resolver y no el desarrollador).
Es un resumen muy rápido, pero tengo que escribir un artículo sobre esto
PD: ahora... ¡lluevan las piedras!