Dutch PHP Conference 2027

La classe Yaf_Loader

(Yaf >=1.0.0)

Introduction

Yaf_Loader introduit une solution complète de chargement automatique pour Yaf.

Lors de la première récupération d'une instance de Yaf_Application, Yaf_Loader instancie un singleton et s'enregistre auprès de spl_autoload. Il est possible de récupérer une instance à l'aide de Yaf_Loader::getInstance()

Yaf_Loader ne tente de charger une classe qu'une seule fois ; en cas d'échec, selon la valeur de yaf.use_spl_autoload, si cette configuration est à On, Yaf_Loader::autoload() retournera false, laissant ainsi sa chance à une autre fonction de chargement automatique. Si elle est à Off (valeur par défaut), Yaf_Loader::autoload() retournera true, et surtout une alerte très utile sera déclenchée (très utile pour découvrir pourquoi une classe n'a pas pu être chargée).

Note:

Il est recommandé de laisser yaf.use_spl_autoload à Off, à moins qu'une bibliothèque ne dispose de son propre mécanisme de chargement automatique et qu'il soit impossible de le réécrire.

Par défaut, Yaf_Loader suppose que toutes les bibliothèques (les scripts définissant des classes) sont stockées dans le répertoire global des bibliothèques, qui est défini dans le php.ini (yaf.library).

Pour que Yaf_Loader recherche certaines classes (bibliothèques) dans le répertoire local des classes (qui est défini dans application.ini, et qui vaut par défaut application.directory . "/library"), il faut enregistrer le préfixe de classe à l'aide de Yaf_Loader::registerLocalNameSpace()

Voici quelques exemples (en supposant que APPLICATION_PATH vaut application.directory) :

Exemple #1 Exemple de configuration

// En supposant la configuration suivante dans le php.ini :
yaf.library = "/global_dir"

// En supposant la configuration suivante dans application.ini
application.library = APPLICATION_PATH "/library"
En supposant que l'espace de noms local suivant est enregistré :

Exemple #2 Enregistrement d'un espace de noms local

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

Exemple #3 Exemple de chargement de classe

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

Exemple #4 Exemple de chargement d'une classe avec namespace

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

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

Il est à noter que tous les dossiers commencent par une majuscule ; il est possible de les mettre en minuscules en définissant yaf.lowcase_path = On dans le php.ini

Yaf_Loader est également conçu pour charger les classes MVC, et la règle est la suivante :

Exemple #5 Exemple de chargement de classes MVC

Controller Classes =>
// APPLICATION_PATH/controllers/

Model Classes =>
// APPLICATION_PATH/models/

Plugin Classes =>
// APPLICATION_PATH/plugins/
Yaf identifie le suffixe d'une classe (c'est le comportement par défaut, il est aussi possible de passer au préfixe en modifiant la configuration yaf.name_suffix) pour déterminer s'il s'agit d'une classe MVC :

Exemple #6 Distinction des classes MVC

Controller Classes =>
    // ***Controller

Model Classes =>
    // ***Model

Plugin Classes =>
    // ***Plugin
quelques exemples :

Exemple #7 Exemple de chargement MVC

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

Note:

À partir de la version 2.1.18, Yaf gère le chargement automatique des contrôleurs côté script utilisateur (c'est-à-dire le chargement automatique déclenché par un script PHP utilisateur, par exemple l'accès à une propriété statique d'un contrôleur dans le Bootstrap ou dans les plugins), mais le chargeur automatique ne cherche le script de la classe du contrôleur que dans le dossier du module par défaut, à savoir "APPLICATION_PATH/controllers/".

de plus, le répertoire sera affecté par yaf.lowcase_path.

Synopsis de la classe

class Yaf_Loader {
/* Propriétés */
protected $_local_ns;
protected $_library;
protected $_global_library;
static $_instance;
/* Méthodes */
private function __construct()
public function autoload(string $class_name): bool
public function clearLocalNamespace(): bool
public static function getInstance(string $local_library_path = null, string $global_library_path = null): Yaf_Loader|false
public function getLibraryPath(bool $is_global = false): string
public function getLocalNamespace(): array
public function getNamespacePath(string $class_name): string
public function getNamespaces(): array
public static function import(string $file): bool
public function isLocalName(string $class_name): bool
public function registerLocalNamespace(string|array $namespace, string $path = null): Yaf_Loader|false
public function registerNamespace(string|array $namespace, string $path = null): Yaf_Loader|false
public function setLibraryPath(string $library_path, bool $is_global = false): Yaf_Loader
}

Propriétés

_local_ns

_library

Par défaut, cette valeur est application.directory . "/library" ; il est possible de la modifier soit dans le fichier application.ini (application.library), soit par un appel à Yaf_Loader::setLibraryPath()

_global_library

_instance

Sommaire

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top