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

Discover the SensioLabs Support

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

The ClassLoader Component

Caution: You are browsing the documentation for Symfony version 2.0 which is not maintained anymore. If some of your projects are still using this version, consider upgrading.

The ClassLoader Component

The ClassLoader Component loads your project classes automatically if they follow some standard PHP conventions.

Whenever you use an undefined class, PHP uses the autoloading mechanism to delegate the loading of a file defining the class. Symfony2 provides a "universal" autoloader, which is able to load classes from files that implement one of the following conventions:

  • The technical interoperability standards for PHP 5.3 namespaces and class names;
  • The PEAR naming convention for classes.

If your classes and the third-party libraries you use for your project follow these standards, the Symfony2 autoloader is the only autoloader you will ever need.

Installation

You can install the component in many different ways:

Usage

Registering the UniversalClassLoader autoloader is straightforward:

1
2
3
4
5
6
7
8
9
require_once '/path/to/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';

use Symfony\Component\ClassLoader\UniversalClassLoader;

$loader = new UniversalClassLoader();

// ... register namespaces and prefixes here - see below

$loader->register();

For minor performance gains class paths can be cached in memory using APC by registering the ApcUniversalClassLoader:

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

use Symfony\Component\ClassLoader\ApcUniversalClassLoader;

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

The autoloader is useful only if you add some libraries to autoload.

Note

The autoloader is automatically registered in a Symfony2 application (see app/autoload.php).

If the classes to autoload use namespaces, use the registerNamespace() or registerNamespaces() methods:

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

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

$loader->register();

For classes that follow the PEAR naming convention, use the registerPrefix() or registerPrefixes() methods:

1
2
3
4
5
6
7
8
$loader->registerPrefix('Twig_', __DIR__.'/vendor/twig/lib');

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

$loader->register();

Note

Some libraries also require their root path be registered in the PHP include path (set_include_path()).

Classes from a sub-namespace or a sub-hierarchy of PEAR classes can be looked for in a location list to ease the vendoring of a sub-set of classes for large projects:

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/lib',
));

$loader->register();

In this example, if you try to use a class in the Doctrine\Common namespace or one of its children, the autoloader will first look for the class under the doctrine-common directory, and it will then fallback to the default Doctrine directory (the last one configured) if not found, before giving up. The order of the registrations is significant in this case.