Creative Commons License
This work is licensed under a
Creative Commons
Attribution-Share Alike 3.0
Unported License.

Master Symfony2 fundamentals

Be trained by SensioLabs experts (2 to 6 day sessions -- French or English).
trainings.sensiolabs.com

Symfony hosting done right

ServerGrove, outstanding support at the right price for your Symfony hosting needs.
servergrove.com

Discover the SensioLabs Support

Access to the SensioLabs Competency Center for an exclusive and tailor-made support on Symfony
sensiolabs.com

Il componente ClassLoader

Il componente ClassLoader

Il componente ClassLoader carica le classi di un progetto automaticamente, purché seguano alcune convenzioni standard di PHP.

Ogni volta che si usa una classe non ancora definita, PHP utilizza il meccanismo di auto-caricamento per delegare il caricamento di un file che definisca la classe. Symfony2 fornisce un autoloader "universale", capace di caricare classi da file che implementano una delle seguenti convenzioni:

  • Gli standard tecnici di interoperabilità per i nomi di classi e gli spazi dei nomi di PHP 5.3;
  • La convenzione dei nomi delle classi di PEAR.

Se le proprie classi e le librerie di terze parti usate per il proprio progetto seguono questi standard, l'autoloader di Symfony2 è l'unico autoloader di cui si ha bisogno.

Installazione

Si può installare il componente in molti modi diversi:

  • Usare il repository ufficiale su Git (https://github.com/symfony/ClassLoader);
  • Installarlo via PEAR (pear.symfony.com/ClassLoader);
  • Installarlo via Composer (symfony/class-loader su Packagist).

Uso

New in version 2.1: Il metodo useIncludePath è stato aggiunto in Symfony 2.1.

La registrazione di UniversalClassLoader è molto semplice:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
require_once '/percorso/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';

use Symfony\Component\ClassLoader\UniversalClassLoader;

$loader = new UniversalClassLoader();

// Si può cercare in include_path come ultima risorsa.
$loader->useIncludePath(true);

// ... registrare qui spazi di nomi e prefissi (vedere sotto)

$loader->register();

Per un minimo guadagno di prestazioni, i percorsi delle classi possono essere memorizzati usando APC, registrando ApcUniversalClassLoader:

1
2
3
4
5
6
7
require_once '/percorso/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
require_once '/percorso/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php';

use Symfony\Component\ClassLoader\ApcUniversalClassLoader;

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

L'autoloader è utile solo se si aggiungono delle librerie da auto-caricare.

Note

L'autoloader è registrato automaticamente in ogni applicazione Symfony2 (si veda app/autoload.php).

Se le classi da auto-caricare usano spazi dei nomi, usare i metodi registerNamespace() o registerNamespaces():

1
2
3
4
5
6
7
8
$loader->registerNamespace('Symfony', __DIR__.'/vendor/symfony/symfony/src');

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

$loader->register();

Per classi che seguono la convenzione dei nomi di PEAR, usare i metodi registerPrefix() o registerPrefixes():

1
2
3
4
5
6
7
8
$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();

Note

Alcune librerie richiedono anche che il loro percorso radice sia registrato nell'include_path di PHP (set_include_path()).

Le classi di un sotto-spazio dei nomi o di una sotto-gerarchia di PEAR possono essere cercate in un elenco di posizioni, per facilitare i venditori di un sotto-insieme di classi per grossi progetti:

1
2
3
4
5
6
7
8
$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();

In questo esempio, se si prova a usare una classe nello spazio dei nomi Doctrine\Common o uno dei suoi figli, l'autoloader cercherà prima le classi sotto la cartella doctrine-common, quindi, se non le trova, cercherà nella cartella Doctrine (l'ultima configurata), infine si arrenderà. In questo caso, l'ordine di registrazione è significativo.