Chargement automatique des fichiers
En php, quand on utilise plusieurs fichiers, on doit les charger, par exemple si un fichier A a besoin d'un code définit dans un fichier B, on va utiliser un include ou require pour charger le fichier et pouvoir l'utiliser.
L'autoload, c'est une méthode qui va s'occuper de faire ces chargements de fichiers dès qu'on utilise une classe. C'est à dire que lorsque l'on va instancier la classe Router, avec un new Router(), l'autoload va chercher s'il trouve le fichier associé, et l'inclure pour nous.
Pour cela on utilise la fonction spl_autoload_register
Je te donne un exemple pour charger les fichiers du Framework :
{"language":"application/x-httpd-php","content":"<?php\n\tspl_autoload_register(function($class){\n\t\tif(file_exists('Framework/' . $class . '.php'))\n\t\t{\n\t\t\trequire_once('Framework/' . $class . '.php');\n\t\t}\n\t});","filename":"index.php"}
il y a deux choses que je ne comprend pas... Déjà le paramètre $class viens d'où?
Il est passé automatiquement par php lors d'une instance, pour reprendre l'exemple d'avant, si tu fait un new Router() et que la classe Router n'est pas définit, la fonction d'autoload sera appelée, et $class aura pour valeur "Router".
Include, require, _once
Ah d'accord, ensuite, le require_once, pourquoi once? Est ce que ça change quelque chose par rapport à un require classique?
Il y a une petite nuance, déjà il y a include et require qui sont différents, les deux permettent de charger un fichier, mais si le fichier n'est pas trouvé, include lèvera un warning et continuera l’exécution du code, alors que require lèvera une erreur bloquante, empêchant l’exécution de la suite du code.
Les deux existent avec le suffixe _once, la différence est que le fichier ne sera chargé qu'une seule fois, si on fait deux fois include de suite du même fichier, celui là sera inclus deux fois de suite, dupliquant le résultat, avec include_once, la deuxième fois, l'instruction sera tout simplement ignorée.
Etant donné que l'on charge des classes dans le cas présent, il est inutile de charger plusieurs fois le même fichier, ça n'apporterait rien de plus, et risquerai en plus de générer des erreurs. Donc le require_once permet d'éviter ce risque.
Un autoload pour mon framework
J'ai tout compris, donc je dois faire la même chose pour les autres dossiers? Controller, Model, Vue ...
Attention, cette méthode ne doit permettre de charger que des fichiers de classes, donc pas de vue, ni de css, de js ou de média.
Ah donc juste Controller et Model
{"language":"application/x-httpd-php","content":"<?php\n\tspl_autoload_register(function($class){\n\t\tif(file_exists('Framework/' . $class . '.php'))\n\t\t{\n\t\t\trequire_once('Framework/' . $class . '.php');\n\t\t}\n\t\tif(file_exists('Controller/' . $class . '.php'))\n\t\t{\n\t\t\trequire_once('Controller/' . $class . '.php');\n\t\t}\n\t\tif(file_exists('Model/' . $class . '.php'))\n\t\t{\n\t\t\trequire_once('Model/' . $class . '.php');\n\t\t}\n\t});","filename":"index.php"}
Voilà c'est bon, on peut passer à la suite !
Pas tout à fait, tu as oublié un dossier que l'on avait créé récemment, les exceptions.
Ah oui, mais alors à chaque fois qu'il y aura un nouveau dossier avec des classes il faudra modifier l'autoload pour rajouter ce dossier? Tu ne penses pas que ça va être lourd et répétitif?
Effectivement, je n'avais pas prévu d'aborder ça pour le moment, mais c'est une bonne idée. Je te propose que l'on fasse un fichier de configuration qui nous servira à paramétrer ça facilement si ça te dit. J'ai terminé cette partie