El componente ClassLoader

El componente ClassLoader carga automáticamente las clases de tu proyecto si estas siguen algunas convenciones PHP estándar.

Siempre que uses una clase no definida, PHP utiliza el mecanismo de carga automática para delegar la carga de un archivo de definición de clase. Symfony2 proporciona un cargador automático «universal», que es capaz de cargar clases desde los archivos que implementan uno de los siguientes convenios:

  • Los estándares de interoperabilidad técnica para los espacios de nombres y nombres de clases de PHP 5.3;
  • La convención de nomenclatura de clases de PEAR.

Si tus clases y las bibliotecas de terceros que utilizas en tu proyecto siguen estas normas, el cargador automático de Symfony2 es el único cargador automático que necesitarás siempre.

Instalando

Puedes instalar el componente de varias maneras diferentes:

Usando

Nuevo en la versión 2.1: El método useIncludePath se agregó en Symfony 2.1.

Registrar la clase del cargador automático Symfony\Component\ClassLoader\UniversalClassLoader es sencillo:

require_once '/ruta/a/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';

use Symfony\Component\ClassLoader\UniversalClassLoader;

$loader = new UniversalClassLoader();

// como último recurso busca en include_path.
$loader->useIncludePath(true);

// ... aquí registra el espacio de nombres y prefijos
// - ve más abajo

$loader->register();

Para una menor ganancia en rendimiento puedes memorizar en caché las rutas de las clases usando APC, con sólo registrar la clase Symfony\Component\ClassLoader\ApcUniversalClassLoader:

require_once '/ruta/a/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
require_once '/ruta/a/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';

use Symfony\Component\ClassLoader\ApcUniversalClassLoader;

$loader = new ApcUniversalClassLoader('apc.prefix.');
$loader->register();

El cargador automático es útil sólo si agregas algunas bibliotecas al cargador automático.

Nota

El autocargador se registra automáticamente en una aplicación Symfony2 (consulta el app/autoload.php).

Si las clases a cargar automáticamente utilizan espacios de nombres, utiliza cualquiera de los métodos registerNamespace() o registerNamespaces():

$loader->registerNamespace('Symfony', __DIR__.'/vendor/symfony/symfony/src');

$loader->registerNamespaces(array(
    'Symfony' => __DIR__.'/../vendor/symfony/symfony/src',
    'Monolog' => __DIR__.'/../vendor/monolog/monolog/src',
));

$loader->register();

Para las clases que siguen la convención de nomenclatura de PEAR, utiliza cualquiera de los métodos registerPrefix() o registerPrefixes():

$loader->registerPrefix('Twig_', __DIR__.'/vendor/twig/twig/lib');

$loader->registerPrefixes(array(
    'Swift_' => __DIR__.'/vendor/swiftmailer/swiftmailer/lib/classes',
    'Twig_'  => __DIR__.'/vendor/twig/twig/lib',
));

$loader->register();

Nota

Algunas bibliotecas también requieren que su ruta de acceso raíz esté registrada en la ruta de include PHP (set_include_path()).

Las clases de un subespacio de nombres o una subjerarquía de clases PEAR se pueden buscar en una lista de ubicaciones para facilitar la utilización de un subconjunto de clases de terceros en proyectos grandes:

$loader->registerNamespaces(array(
    'Doctrine\\Common'           => __DIR__.'/vendor/doctrine/common/lib',
    'Doctrine\\DBAL\\Migrations' => __DIR__.'/vendor/doctrine/migrations/lib',
    'Doctrine\\DBAL'             => __DIR__.'/vendor/doctrine/dbal/lib',
    'Doctrine'                   => __DIR__.'/vendor/doctrine/orm/lib',
));

$loader->register();

En este ejemplo, si intentas utilizar una clase en el espacio de nombres Doctrine\Common o una de sus hijas, el cargador automático buscará primero la clase en el directorio doctrine\common, y entonces, si no lo encuentra, vuelve al directorio de reserva predeterminado, el último Doctrine configurado antes de darse por vencido. El orden de registro es importante en este caso.

Bifúrcame en GitHub