Estimado Salvador, bienvenido
El tema no es complejo, para PHP todo es más artesanal (comparando con Java) y la idea de aplicar las capas es relativamente simple:
- Crear 3 subdirectorios: interfaz, dominio y persistencia
- Para resolver el tema de las rutas relativas, el mejor camino es que cuentes con un archivo de configuración en la raíz de tu proyecto y posteriormente cada capa tenga un config.php que lo que hace es ir al nivel superior y así todas las clases del paquete deben incluirlo.
- Recomendado: usar un patrón Factory para concentrar las peticiones de cada capa.
Por ejemplo:
En tu raíz tienes: index.php y config.php con constantes que configuras con la información de tus directorios.
Código PHP:
<?php
error_reporting(E_ALL | E_STRICT);
/* RUTAS */
define('HOME', 'C:\xampp\htdocs');
define('APP_NAME', 'miaplicacion');
define('APP', HOME . DIRECTORY_SEPARATOR . APP_NAME );
define('LOG', APP . DIRECTORY_SEPARATOR . 'logs' );
/* 3 CAPAS */
define('PRE', APP . DIRECTORY_SEPARATOR . 'presentacion');
define('DOM', APP . DIRECTORY_SEPARATOR . 'dominio');
define('PER', APP . DIRECTORY_SEPARATOR . 'persistencia');
Posteriormente desde tu index incluyes el archivo de configuración y si quieres usar una clase de Presentación deberás hacer lo siguiente:
Código PHP:
<?php
require_once 'config.php';
require_once PRE . DIRECTORY_SEPARATOR . 'UsuarioPresentacion.php';
$usuario = new Usuario();
echo $usuario::getAll();
En e caso de los paquetes todos deberán incluir este config "falso":
Código PHP:
<?php require_once ("../config.php") ?>
Y tus clases de presentación lo usarán de esta forma:
Código PHP:
<?php
require_once 'config.php';
require_once DOM . DIRECTORY_SEPARATOR . 'Usuario.php';
abstract class UsuarioPresentacion
{
/* código de la clase */
}
En este ejemplo incluyes el archivo de configuración genérico, dependiendo de donde esté haciendo la llamada, tu clase Usuario siempre encuentra el archivo de configuración (y no tienes que estar jugando con "..", ".", etc).
Aquí puedes observar que la clase UsuarioPresentación conoce y depende de la clase Usuario de la capa de dominio, y así la siguiente conocerá a Usuario de la capa de persistencia (ahí está la esencia de las 3 capas):
interfaz -> dominio -> persistencia
En resumen rápido, esta sería la forma de hacerlo "artesanalmente", otras opciones podrías optar por un MVC a través de un framework, pero ya no sería una arquitectura de 3 capas, sería otra solución un poco más especializada.
Busca en Google que encontrarás artículos al respecto.