PHP
Amorce de chargement automatique
Recherche…
Syntaxe
- exiger
- spl_autoload_require
Remarques
Le chargement automatique, dans le cadre d'une stratégie-cadre, simplifie la quantité de code standard que vous devez écrire.
Définition de classe en ligne, aucun chargement requis
// zoo.php
class Animal {
public function eats($food) {
echo "Yum, $food!";
}
}
$animal = new Animal();
$animal->eats('meat');
PHP sait ce qu'est Animal
avant d'exécuter un new Animal
, car PHP lit les fichiers source de haut en bas. Mais que faire si nous voulions créer de nouveaux animaux dans de nombreux endroits, pas seulement dans le fichier source où il est défini? Pour ce faire, nous devons charger la définition de classe.
Chargement manuel des classes avec require
// Animal.php
class Animal {
public function eats($food) {
echo "Yum, $food!";
}
}
// zoo.php
require 'Animal.php';
$animal = new Animal;
$animal->eats('slop');
// aquarium.php
require 'Animal.php';
$animal = new Animal;
$animal->eats('shrimp');
Ici nous avons trois fichiers. Un fichier ("Animal.php") définit la classe. Ce fichier n'a pas d'effets secondaires en plus de définir la classe et conserve soigneusement toutes les connaissances sur un "Animal" au même endroit. C'est facilement contrôlé par la version. Il est facilement réutilisable.
Deux fichiers consomment le fichier "Animal.php" en require
manuellement le fichier. Là encore, PHP lit les fichiers sources de haut en bas, donc le besoin va et trouve le fichier "Animal.php" et rend la définition de la classe Animal
disponible avant d'appeler un new Animal
.
Maintenant, imaginez que nous avions des dizaines ou des centaines de cas où nous voulions effectuer un new Animal
. Cela nécessiterait (censé être conçu) beaucoup, beaucoup require
déclarations très fastidieuses à coder.
Le chargement automatique remplace le chargement de la définition de classe manuelle
// autoload.php
spl_autoload_register(function ($class) {
require_once "$class.php";
});
// Animal.php
class Animal {
public function eats($food) {
echo "Yum, $food!";
}
}
// zoo.php
require 'autoload.php';
$animal = new Animal;
$animal->eats('slop');
// aquarium.php
require 'autoload.php';
$animal = new Animal;
$animal->eats('shrimp');
Comparez cela aux autres exemples. Notez que la require "Animal.php"
été remplacée par require "autoload.php"
. Nous incluons toujours un fichier externe au moment de l'exécution, mais au lieu d'inclure une définition de classe spécifique , nous incluons une logique pouvant inclure n'importe quelle classe. C'est un niveau d'indirection qui facilite notre développement. Au lieu d'écrire un require
pour chaque classe , nous, nous écrivons un require
pour toutes les classes. Nous pouvons remplacer N require
avec 1 require
.
La magie se produit avec spl_autoload_register . Cette fonction PHP prend une fermeture et ajoute la fermeture à une file d' attente de fermetures. Lorsque PHP rencontre une classe pour laquelle il n'a pas de définition, PHP transmet le nom de la classe à chaque fermeture de la file. Si la classe existe après l'appel d'une fermeture, PHP revient à son activité précédente. Si la classe ne parvient pas à exister après avoir essayé toute la file d'attente, PHP se bloque avec "Class", quel que soit "non trouvé".
Autoloading dans le cadre d'une solution cadre
// autoload.php
spl_autoload_register(function ($class) {
require_once "$class.php";
});
// Animal.php
class Animal {
public function eats($food) {
echo "Yum, $food!";
}
}
// Ruminant.php
class Ruminant extends Animal {
public function eats($food) {
if ('grass' === $food) {
parent::eats($food);
} else {
echo "Yuck, $food!";
}
}
}
// Cow.php
class Cow extends Ruminant {
}
// pasture.php
require 'autoload.php';
$animal = new Cow;
$animal->eats('grass');
Grâce à notre chargeur automatique générique, nous avons accès à toute classe qui suit notre convention de dénomination d'autochargeur. Dans cet exemple, notre convention est simple: la classe souhaitée doit avoir un fichier dans le même répertoire nommé pour la classe et se terminant par ".php". Notez que le nom de la classe correspond exactement au nom du fichier.
Sans autoloading, nous aurions besoin manuellement require
classes de base. Si nous construisions un zoo d'animaux, nous aurions des milliers d'exigences qui pourraient être remplacées plus facilement par un seul chargeur automatique.
En dernière analyse, l'autoloading PHP est un mécanisme qui vous aide à écrire moins de code mécanique pour vous permettre de vous concentrer sur la résolution de problèmes métier. Tout ce que vous avez à faire est de définir une stratégie qui mappe le nom de la classe au nom du fichier . Vous pouvez lancer votre propre stratégie de chargement automatique, comme ici. Vous pouvez également utiliser n'importe laquelle des normes adoptées par la communauté PHP: PSR-0 ou PSR-4 . Vous pouvez également utiliser composer pour définir et gérer ces dépendances de manière générique.
Chargement automatique avec Composer
Composer génère un fichier vendor/autoload.php
.
Vous pourriez simplement inclure ce fichier et vous obtiendrez un chargement automatique gratuit.
require __DIR__ . '/vendor/autoload.php';
Cela facilite le travail avec des dépendances tierces.
Vous pouvez également ajouter votre propre code à l'autochargeur en ajoutant une section de chargement automatique à votre composer.json
.
{
"autoload": {
"psr-4": {"YourApplicationNamespace\\": "src/"}
}
}
Dans cette section, vous définissez les mappages à chargement automatique. Dans cet exemple, il s'agit d'un mappage PSR-4 d'un espace de noms vers un répertoire: le répertoire /src
réside dans le dossier racine de vos projets, au même niveau que le répertoire /vendor
. Un exemple de nom de fichier serait src/Foo.php
contenant une classe YourApplicationNamespace\Foo
.
Important: Après avoir ajouté de nouvelles entrées à la section autoload, vous devez réexécuter la commande dump-autoload
pour générer à nouveau et mettre à jour le fichier vendor/autoload.php
avec les nouvelles informations.
En plus du chargement automatique du PSR-4
, Composer prend également en charge le chargement automatique des files
PSR-0
, classmap
et files
. Voir la référence de chargement automatique pour plus d'informations.
Lorsque vous /vendor/autoload.php
fichier /vendor/autoload.php
, il retourne une instance de Composer Autoloader. Vous pouvez stocker la valeur de retour de l'appel d'inclusion dans une variable et ajouter d'autres espaces de noms. Cela peut être utile pour charger automatiquement des classes dans une suite de tests, par exemple.
$loader = require __DIR__ . '/vendor/autoload.php';
$loader->add('Application\\Test\\', __DIR__);