L'exemple de cet article décrit l'utilisation du chargement automatique dans le tutoriel Zend Framework. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
1 Présentation
Le chargement automatique est un mécanisme qui ne nécessite pas d'écriture manuelle de code PHP. Reportez-vous à » Chargement automatique manuel PHP Une fois l'autochargeur défini, il sera automatiquement appelé au cas où vous essaieriez d'utiliser une classe ou une interface non définie.
Grâce au chargement automatique, vous n'avez pas à vous soucier de l'emplacement de stockage des classes dans votre projet. Avec un chargeur automatique bien défini, vous n'avez pas besoin de penser à l'emplacement d'un fichier de classe par rapport au fichier de classe actuel, vous utilisez simplement la classe et le chargeur automatique trouvera automatiquement le fichier.
De plus, le chargement automatique garantit qu'il n'est chargé qu'une seule fois, améliorant ainsi les performances - il peut donc être utilisé à la place de require_once().
Zend Framework encourage l'utilisation du chargement automatique et fournit de nombreux outils pour charger automatiquement les bibliothèques de code et le code d'application. Voici un aperçu de ces outils et comment les utiliser efficacement.
Convention d'implémentation du chargement automatique
Convention de dénomination des classes
Zend Framework emprunte l'idée de PEAR, qui est une relation 1:1 entre les noms de classe et les systèmes de fichiers. Remplacez simplement le séparateur de répertoire par le caractère de soulignement ("_") pour représenter le chemin d'accès au fichier, puis ajoutez le suffixe ".php". Par exemple, la classe "Foo_Bar_Baz" correspondrait à "Foo/Bar/Baz.php" sur le système de fichiers. En supposant que l'emplacement de la classe a été défini via include_path de PHP, cela permet de trouver les noms de fichiers via include() et require() par rapport au chemin défini dans include_path.
De plus, il est recommandé d'utiliser le nom du fournisseur ou le nom du projet comme préfixe. Cela signifie que toutes les classes que vous écrivez ont un préfixe de classe commun, par exemple, tout le code dans Zend Framework est préfixé par "Zend_". Cette convention de dénomination permet d'éviter les conflits de noms. Dans ZendFramework, on fait souvent référence au préfixe "namespace", attention à ne pas le confondre avec l'espace de noms local de PHP.
Convention de conception de l'Autoloader
Zend Framework prend en charge le chargement automatique via Zend_Loader_Autoloader, qui fournit principalement les objectifs et les éléments de conception suivants :
Fournit une correspondance d'espace de noms. Si le préfixe d'espace de noms de la classe est un espace de noms non enregistré, FALSE sera renvoyé.
Permet de définir un autochargeur comme autochargeur alternatif. Une équipe peut être largement distribuée ou utiliser un préfixe d'espace de noms non défini, auquel cas elle essaiera de correspondre à n'importe quel préfixe d'espace de noms. Toutefois, cette approche n’est pas recommandée car elle peut entraîner des recherches inutiles.
Autoriser l'activation de la suppression des invites d'erreur. Il devrait donc être désactivé par défaut. Pendant la phase de développement, il peut être activé.
Le chargement automatique peut être personnalisé. Certains développeurs ne souhaitent pas utiliser Zend_Loader::loadClass() pour le chargement automatique, mais souhaitent quand même utiliser le mécanisme de chargement automatique de Zend Framework. Zend_Loader_Autoloader permet l'utilisation du chargement automatique personnalisé.
Permet le chargement automatique des chaînes de rappel à l'aide de SPL. Le but est de permettre la spécification de chargeurs automatiques supplémentaires.
2. Utilisation :
Habituellement, il vous suffit d'introduire le besoin dans la classe conteneur, puis de l'instancier. Grâce au mode singleton adopté par Zend_Loader_Autoloader, vous pouvez utiliser la méthode getInstance() pour obtenir une instance.
require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance();
Par défaut, toute classe avec un préfixe d'espace de noms de "Zend_" ou "ZendX_" peut être chargée, assurez-vous simplement que include_path est spécifié.
Vous souhaitez utiliser d'autres préfixes d'espace de noms ? Le moyen le meilleur et le plus simple consiste à appeler la méthode registerNamespace(). Vous pouvez le faire en passant un seul préfixe d'espace de noms ou un tableau :
require_once 'Zend/Loader/Autoloader.php'; $loader = Zend_Loader_Autoloader::getInstance(); $loader->registerNamespace('Foo_'); $loader->registerNamespace(array('Foo_', 'Bar_'));
Alternativement, vous pouvez utiliser Zend_Loader_Autoloader comme chargeur automatique de "sauvegarde". Cela signifie que si l'espace de noms est défini ou non, le chargement automatique sera tenté.
$loader->setFallbackAutoloader(true);
(Remarque : Cette méthode n'est pas recommandée, essayez de ne pas l'utiliser).
L'implémentation interne de Zend_Loader_Autoloader utilise Zend_Loader::loadClass() pour charger les classes. Cette méthode utilise include() pour essayer de charger le fichier de classe donné. include() renverra un booléen, ou FALSE en cas d'échec - et émettra également un avertissement PHP. Peut provoquer les problèmes suivants :
Si display_errors est activé, les avertissements seront inclus dans la sortie.
En fonction du niveau de rapport d'erreur que vous configurez, il peut également être affiché dans le journal.
Ces messages d'erreur peuvent être supprimés comme suit : (Mais notez que lorsque display_errors est activé, le journal des erreurs sera toujours affiché.)
$autoloader->suppressNotFoundWarnings(true);
Sélectionnez une version de Zend Framework
ZendFramework/
|-- 1.9.2/
| |-- library/
|-- ZendFramework-1.9.1-minimal/
| -- bibliothèque/
|-- 1.8.4PL1/
|-- bibliothèque/
|-- 1.8.4/
|-- bibliothèque/
|- - ZendFramework- 1.8.3/
| |-- bibliothèque/
|-- 1.7.8/
| |-- bibliothèque/
|-- 1.7.7/
| -- bibliothèque /
|-- 1.7.6/
|-- bibliothèque/
$autoloader->setZfPath($path, 'latest');
$autoloader->setZfPath($path, '1.8');
$autoloader->setZfPath($path, '1.7.7');
Vous pouvez également utiliser le fichier de configuration
[production] autoloaderZfPath = "path/to/ZendFramework" autoloaderZfVersion = "1.7.7" [qa] autoloaderZfVersion = "1.8" [development] autoloaderZfVersion = "latest"
Interface de l'autoloader
注:命名空间前缀和PHP命名空间
PHP5.3已经发布。该版本中,PHP现在已经正式支持命名空间。
然而,Zend Framework的命名空间和PHP 5.3的命名空间完全不同的。 Zend Framework中,提到的“命名空间”,是指一个类前缀。例如,所有的Zend Framework的类名称的前缀“Zend_”。 这是我们指定的“命名空间”。
在Zend Framework 2.0.0使用了原生的PHP命名空间。
自动加载器除了能够指定任意回调以外,Zend Framework还定义了一个需要自动加载类实现的接口Zend_Loader_Autoloader_Interface:
interface Zend_Loader_Autoloader_Interface { public function autoload($class); }
如果您希望在Zend Framework中使用自定义的自动加载器,可以使用 Zend_Loader_Autoloader的 pushAutoloader()和unshiftAutoloader()方法。
通过这些方法将在Zend Framework的内部自动装载器之后追加或之前使用自定义的加载器。
每个方法接受一个可选的第二个参数,类的命名空间前缀。自动加载器只查找给定的类前缀。如果不是指定的类前缀,将跳过自动加载器 , 这可能是一种性能改进方式。
当使用这个接口时,你需要传递类实例到Zend_Loader_Autoloader类的pushAutoloader()和unshiftAutoloader()方法,具体如下:
// Append function 'my_autoloader' to the stack, // to manage classes with the prefix 'My_': $loader->pushAutoloader('my_autoloader', 'My_'); // Prepend static method Foo_Loader::autoload() to the stack, // to manage classes with the prefix 'Foo_': $loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_'); // Assume Foo_Autoloader implements Zend_Loader_Autoloader_Interface: $foo = new Foo_Autoloader(); $autoloader->pushAutoloader($foo, 'Foo_');
Zend_Loader_Autoloader的相关方法
希望本文所述对大家PHP程序设计有所帮助。
更多 Zend Framework教程之Autoloading用法详解相关文章请关注PHP中文网!