# The Yaf_Loader class

&reftitle.intro;

`Yaf_Loader` introduces a comprehensive autoloading solution for Yaf.

The first time an instance of `Yaf_Application` is retrieved, `Yaf_Loader` will instance a singleton, and registers itself with spl_autoload. You retrieve an instance using the `Yaf_Loader::getInstance`

`Yaf_Loader` attempt to load a class only one shot, if failed, depend on yaf.use_spl_auload, if this config is On `Yaf_Loader::autoload` will return &false;, thus give the chance to other autoload function. if it is Off (by default), `Yaf_Loader::autoload` will return &true;, and more important is that a very useful warning will be triggered (very useful to find out why a class could not be loaded).

Please keep yaf.use_spl_autoload Off unless there is some library have their own autoload mechanism and impossible to rewrite it.

By default, `Yaf_Loader` assume all library (class defined script) store in the global library directory, which is defined in the php.ini(yaf.library).

If you want `Yaf_Loader` search some classes(libraries) in the local class directory(which is defined in application.ini, and by default, it is application.directory . "/library"), you should register the class prefix using the `Yaf_Loader::registerLocalNameSpace`

Let's see some examples(assuming APPLICATION_PATH is application.directory):

### Config example

    // Assuming the following configure in php.ini:
    yaf.library = "/global_dir"

    //Assuming the following configure in application.ini
    application.library = APPLICATION_PATH "/library"

Assuming the following local name space is registered:

### Register localnamespace

    <?php
    class Bootstrap extends Yaf_Bootstrap_Abstract{
         public function _initLoader($dispatcher) {
              Yaf_Loader::getInstance()->registerLocalNameSpace(array("Foo", "Bar"));
         }
    ?>

Then the autoload examples:

### Load class example

    class Foo_Bar_Test =>
      // APPLICATION_PATH/library/Foo/Bar/Test.php

    class GLO_Name  =>
      // /global_dir/Glo/Name.php

    class BarNon_Test
      // /global_dir/Barnon/Test.php

### Load namespace class example

    class \Foo\Bar\Dummy =>
       // APPLICATION_PATH/library/Foo/Bar/Dummy.php

    class \FooBar\Bar\Dummy =>
       // /global_dir/FooBar/Bar/Dummy.php

You may noticed that all the folder with the first letter capitalized, you can make them lowercase by set yaf.lowcase_path = On in php.ini

`Yaf_Loader` is also designed to load the MVC classes, and the rule is:

### MVC class loading example

    Controller Classes =>
    // APPLICATION_PATH/controllers/

    Model Classes =>
    // APPLICATION_PATH/models/

    Plugin Classes =>
    // APPLICATION_PATH/plugins/

Yaf identify a class's suffix(this is by default, you can also change to the prefix by change the configure yaf.name_suffix) to decide whether it is a MVC class:

### MVC class distinctions

    Controller Classes =>
        // ***Controller

    Model Classes =>
        // ***Model

    Plugin Classes =>
        // ***Plugin

some examples:

### MVC loading example

    class IndexController
        // APPLICATION_PATH/controllers/Index.php

    class DataModel =>
       // APPLICATION_PATH/models/Data.php

    class DummyPlugin =>
      // APPLICATION_PATH/plugins/Dummy.php

    class A_B_TestModel =>
      // APPLICATION_PATH/models/A/B/Test.php

As of 2.1.18, Yaf supports Controllers autoloading for user script side, (which means the autoloading triggered by user php script, eg: access a controller static property in Bootstrap or Plugins), but autoloader only try to locate controller class script under the default module folder, which is "APPLICATION_PATH/controllers/".

also, the directory will be affected by yaf.lowcase_path.
&reftitle.classsynopsis;

        Yaf_Loader

          Yaf_Loader

        &Properties;

         protected
         _local_ns

         protected
         _library

         protected
         _global_library

         static
         _instance

        &Methods;

&reftitle.properties;

`_local_ns`

`_library`

- By default, this value is application.directory . "/library", you can change this either in the application.ini(application.library) or call to `Yaf_Loader::setLibraryPath`

`_global_library`

`_instance`

&reference.yaf.entities.yaf-loader;