Class Autoloading ¶
Yii relies on the class autoloading mechanism
to locate and include all required class files. It provides a high-performance class autoloader that is compliant with the
The autoloader is installed when you include the
Note: For simplicity of description, in this section we will only talk about autoloading of classes. However, keep in mind that the content we are describing here applies to autoloading of interfaces and traits as well.
Using the Yii Autoloader ¶
To make use of the Yii class autoloader, you should follow two simple rules when creating and naming your classes:
- Each class must be under a namespace (e.g.
- Each class must be saved in an individual file whose path is determined by the following algorithm:
// $className is a fully qualified class name without the leading backslash $classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
For example, if a class name and namespace is
foo\bar\MyClass, the alias for the corresponding class file path
@foo/bar/MyClass.php. In order for this alias to be resolvable into a file path,
@foo/bar must be a root alias.
When using the Basic Project Template, you may put your classes under the top-level
app so that they can be autoloaded by Yii without the need of defining a new alias. This is because
@app is a predefined alias, and a class name like
can be resolved into the class file
AppBasePath/components/MyClass.php, according to the algorithm just described.
In the Advanced Project Template, each tier has its own root alias. For example,
the front-end tier has a root alias
@frontend, while the back-end tier root alias is
@backend. As a result,
you may put the front-end classes under the namespace
frontend while the back-end classes are under
backend. This will
allow these classes to be autoloaded by the Yii autoloader.
To add a custom namespace to the autoloader you need to define an alias for the base directory of the namespace using Yii::setAlias().
For example to load classes in the
foo namespace that are located in the
path/to/foo directory you will call
Class Map ¶
The Yii class autoloader supports the class map feature, which maps class names to the corresponding class file paths. When the autoloader is loading a class, it will first check if the class is found in the map. If so, the corresponding file path will be included directly without further checks. This makes class autoloading super fast. In fact, all core Yii classes are autoloaded this way.
You may add a class to the class map, stored in
Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
Using Other Autoloaders ¶
Because Yii embraces Composer as a package dependency manager, it is recommended that you also install the Composer autoloader. If you are using 3rd-party libraries that have their own autoloaders, you should also install those.
When using the Yii autoloader together with other autoloaders, you should include the
after all other autoloaders are installed. This will make the Yii autoloader the first one responding to
any class autoloading request. For example, the following code is extracted from
the entry script of the Basic Project Template. The first
line installs the Composer autoloader, while the second line installs the Yii autoloader:
require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
You may use the Composer autoloader alone without the Yii autoloader. However, by doing so, the performance of your class autoloading may be degraded, and you must follow the rules set by Composer in order for your classes to be autoloadable.
Info: If you do not want to use the Yii autoloader, you must create your own version of the
Yii.phpfile and include it in your entry script.
Autoloading Extension Classes ¶
The Yii autoloader is capable of autoloading extension classes. The sole requirement
is that an extension specifies the
autoload section correctly in its
composer.json file. Please refer to the
Composer documentation for more details about specifying
In case you do not use the Yii autoloader, the Composer autoloader can still autoload extension classes for you.