web-dev-qa-db-fra.com

Qu'est-ce que le chargement automatique? Comment utilisez-vous spl_autoload, __autoload et spl_autoload_register?

J'apprends les normes avancées PHP et j'essaie d'implémenter de nouvelles méthodes utiles. Auparavant, j'utilisais __autoload _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Pour échapper, il suffit d'inclure plusieurs fichiers sur chaque page, mais j'ai récemment vu un conseil sur __autoload manual

spl_autoload_register () offre une alternative plus souple pour le chargement automatique de classes. Pour cette raison, l'utilisation de __ autoload () est déconseillée et peut être obsolète ou supprimée à l'avenir.

mais je ne peux vraiment pas comprendre comment mettre en œuvre spl_autoload et spl_autoload_register

183
diEcho

spl_autoload_register() vous permet d'enregistrer plusieurs fonctions (ou méthodes statiques de votre propre classe Autoload) que PHP mettra dans une pile/file d'attente et appellera séquentiellement lorsqu'une "nouvelle classe" est déclaré.

Donc 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 transmet ce nom sous forme de chaîne à spl_autoload_register(), qui vous permet de prenez la variable et utilisez-la pour "inclure" la classe/le fichier approprié. Vous n'avez donc pas besoin d'inclure spécifiquement cette classe via une instruction include/require ...

Appelez simplement la classe que vous voulez instancier, comme dans l'exemple ci-dessus, et puisque vous avez enregistré une fonction (via spl_autoload_register()) de votre choix, celle-ci déterminera où se trouve toute votre classe, PHP utilisera cette fonction.

L'avantage d'utiliser spl_autoload_register() est que contrairement à __autoload(), il n'est pas nécessaire d'implémenter une fonction de chargement automatique dans chaque fichier que vous créez. spl_autoload_register() vous permet également d'enregistrer plusieurs fonctions de chargement automatique 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 implémentation par défaut pour __autoload(). Si rien d'autre n'est spécifié et que spl_autoload_register() est appelée sans aucun paramètre, cette fonction sera utilisée pour tout appel ultérieur à __autoload().

En termes plus pratiques, si tous vos fichiers sont situés dans un seul répertoire et que votre application utilise non seulement des fichiers .php, mais également des fichiers de configuration personnalisés avec des extensions .inc, vous pouvez utiliser l’une des stratégies suivantes: ajouter votre répertoire contenant tous les fichiers. fichiers dans le chemin d’inclusion de PHP (via set_include_path()).
Et puisque vous avez également besoin de vos fichiers de configuration, vous utiliseriez spl_autoload_extensions() pour répertorier les extensions que vous voulez PHP) rechercher.

Exemple:

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

Puisque spl_autoload est l'implémentation par défaut de la méthode magique __autoload(), PHP appelle spl_autoload lorsque vous essayez d'instancier une nouvelle classe.

J'espère que cela t'aides...

299
Brownbay

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 charger automatiquement vos classes php sans nécessiter ni inclure ni redéfinir un __autoload() fonction.

Pour illustrer ce comportement, créez simplement un fichier appelé index.php:

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

Créez ensuite un dossier nommé Main situé juste à côté du fichier index.php. Enfin, crée un fichier appelé Application.php situé dans Main et collez-y le code suivant:

<?php namespace Main;
class Application{}
12
user1974206

Voici comment j'utilise Autoload. Dans l'exemple donné, je veux charger des classes pour former 3 répertoires différents.

function namespaceAutoload($rawClass){

$class = str_replace('\\', DIRECTORY_SEPARATOR, $rawClass);

$possiblePaths[] = '..\sys\class\file.php';
$possiblePaths[] = '..\sys\class\lib\file.php';
$possiblePaths[] = '..\sys\class\class.file.inc.php';

foreach ($possiblePaths as $templatePath) {
    $path = str_replace(["\\", "file"], [DIRECTORY_SEPARATOR, $class], $templatePath);
    if (file_exists($path)) {
        require_once "$path";
        break;
    }
} spl_autoload_register("namespaceAutoload"); 

Dans l'exemple donné, le PHP va rechercher l'espace de noms\class dans ces trois répertoires en utilisant ces trois formats de nom de fichier différents.

0
Augusto Santana