web-dev-qa-db-fra.com

Comment utiliser spl_autoload () pendant que __autoload () devient obsolète

Selon http://php.net/manual/en/language.oop5.autoload.php la fonction magique __autoload () deviendra DEPRECATED et DELETED (!) Dans les prochains PHP versions. L'alternative officielle est spl_autoload (). Voir http://www.php.net/manual/en/function.spl-autoload.php . Mais le manuel php ne fait pas expliquer la bonne utilisation de ce bébé.

Ma question: comment remplacer cela (mon chargeur automatique de classe automatique)

function __autoload($class) {
    include 'classes/' . $class . '.class.php';
}

avec une version avec spl_autoload ()? Le problème est: je ne peux pas comprendre comment donner un chemin à cette fonction (elle accepte uniquement les espaces de noms).

Soit dit en passant: il y a beaucoup de discussions concernant ce sujet ici sur SO.com, mais aucune ne donne une solution propre et simple qui remplace mon one-liner sexy.

27
Sliq

Vous devez enregistrer les fonctions de chargement automatique avec spl_autoload_register . Vous devez fournir un "callable" . La meilleure façon de le faire, à partir de 5.3, est d'utiliser une fonction anonyme:

spl_autoload_register(function($class) {
    include 'classes/' . $class . '.class.php';
});

Le principal avantage de cette contre __autoload c'est bien sûr que vous pouvez appeler spl_autoload_register plusieurs fois, tandis que __autoload (comme toute fonction) ne peut être défini qu'une seule fois. Si vous avez du code modulaire, ce serait un inconvénient important.


Mise à jour 2018: il ne devrait pas y avoir vraiment autant d'occasions où vous avez besoin de rouler votre propre chargeur automatique. Il existe une norme largement acceptée (appelée PSR-4 ) et plusieurs implémentations conformes. La façon évidente de le faire est d'utiliser Composer .

35
lonesomeday