237 votes

Quelqu'un explique spl_autoload, __autoload et spl_autoload_register?

Je suis en train d'apprendre adnaced PHP standard et en essayant de mettre en œuvre de nouvelles et de méthodes utiles. plus tôt, j'ai été en utilisant __autoload seulement de s'échapper, y compris de nombreux fichiers sur chaque page, mais récemment, j'ai vu il y a une astuce sur __autoload manual

spl_autoload_register() fournit un moyen plus souple de remplacement pour d'auto-chargement de classes. Pour cette raison, l'aide d' __autoload()est découragé et peut être obsolète ou supprimée dans le futur.

mais j'ai vraiment cant compris comment le mettre en oeuvre spl_autoload et spl_autoload_register

merci de me dire avec un exemple ou fournir des liens.

Merci

401voto

Brownbay Points 1041

spl_autoload_register() vous permet d'enregistrer plusieurs fonctions (ou méthodes statiques à partir de votre propre auto-chargement de la classe) que PHP va mettre dans une pile/de la file d'attente et appel séquentiellement lors d'une "nouvelle Classe" est déclarée.

Ainsi, par exemple:

spl_autoload_register('myAutoloader');

function myAutoloader($className)
{
    $path = '/path/to/class';

    include $path.$className.'.php';
}

//-------------------------------------

$myClass = new MyClass();

Dans l'exemple ci-dessus, "MyClass" est le nom de la classe que vous essayez d'instancier, PHP passe de ce nom comme une chaîne d' spl_autoload_register(), ce qui permet de ramasser de la variable et de l'utiliser pour "comprendre" la classe/fichier. Comme un résultat, vous n'avez pas spécialement besoin d'inclure la classe via un include ou require déclaration...

Tout simplement appeler le nom de la classe à instancier comme dans l'exemple ci-dessus, et puisque vous vous êtes inscrit à une fonction (par spl_autoload_register()) de votre propre qui va déterminer où tous votre classe est situé, PHP utilisera cette fonction.

L'avantage de l'utilisation de spl_autoload_register() , c'est que contrairement à, __autoload(), vous n'avez pas besoin de mettre en œuvre une fonction autoload dans chaque fichier que vous créez. spl_autoload_register() vous permet également de s'inscrire à plusieurs autoload pour accélérer le chargement automatique et le rendre encore plus facile.

Exemple:

spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');

class MyAutoloader
{
    public static function ClassLoader($className)
    {
         //your loading logic here
    }


    public static function LibraryLoader($className)
    {
         //your loading logic here
    }

En ce qui concerne spl_autoload, le manuel indique:

Cette fonction est destinée à être utilisée comme valeur par défaut de mise en œuvre pour l' __autoload(). Si rien d'autre n'est spécifié et spl_autoload_register() est appelée sans paramètres, puis cette fonction sera utilisée pour tout appel ultérieur à l' __autoload().

Plus concrètement, si tous vos fichiers sont situés dans un répertoire unique et que votre application utilise pas seulement .php les fichiers, mais les fichiers de configuration personnalisés .inc extensions par exemple, une stratégie que vous pourriez utiliser à ajouter à votre répertoire contenant tous les fichiers d'include de PHP chemin (via set_include_path()) et puisque vous avez besoin de vos fichiers de configuration, vous devez utiliser spl_autoload_extensions() à la liste des extensions que vous souhaitez PHP chercher.

Exemple:

set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();

Depuis spl_autoload est l'implémentation par défaut de l' __autoload() méthode magique, PHP va appeler spl_autoload lorsque vous essayez et instancier une nouvelle classe.

Espérons que cela aide...

15voto

user1974206 Points 11

Depuis PHP 5.3, vous pouvez utiliser spl_autoload_register() avec des espaces de noms, ce qui signifie que vous pouvez organiser votre projet et de chargement automatique de vos classes php, sans exiger ou d'inclure et sans redéfinir une __autoload() fonction.

Pour démontrer ce comportement, il suffit de créer un fichier appelé index.php :

<?php
spl_autoload_register();
var_dump(new Main\Application);

Ensuite, créez un dossier nommé Principal situé juste à côté de la index.php fichier. Enfin, crée un fichier appelé Application.php situé dans la Principale et collez le code suivant :

<?php namespace Main;
class Application{}

14voto

drebabels Points 203

diEcho je vais dans la même situation que vous, et d'essayer d'envelopper ma tête autour de la façon d'utiliser spl_autoload et spl_auto_load registre, voici une liste de sites que j'ai trouvé pour être utile:

Autoload SPL Tutoriel

3 utile de chargement automatique de règles

spl_autoload vs __autoload

J'ai aussi trouvé Brownbay réponse très utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X