Cette fois, je vais vous apporter une explication détaillée des cas d'application PHP+SPL Quelles sont les précautions pour les applications PHP+SPL, jetons un coup d'œil.
L'article ci-dessus de Rafael Dohms m'a tellement étonné que je n'ai pas pu m'empêcher de le traduire et d'ajouter du contenu en même temps.
SPL, PHP Standard Library (Standard PHP Library), Composants et interfaces intégrés depuis PHP 5.0, et ont progressivement mûri depuis PHP5.3. SPL est en fait intégré à tous les environnements de développement PHP5 et ne nécessite aucune configuration.
Il semble que de nombreux développeurs PHP ne l’utilisent pas, ou n’en ont même pas entendu parler. La raison peut être attribuée à sa documentation semblable à de la neige, qui vous fait ignorer « son existence ». SPL Ce joyau ressemble au « Cœur de l'océan » du Titanic, qui a coulé au fond de la mer. Il convient désormais de le récupérer et de le porter à la place qui lui revient, et c'est le point de vue exprimé dans cet article.
Alors, Que propose SPL ?
SPL fournit des extensions au moteur PHP, telles que des interfaces telles que ArrayAccess, Countable et SeekableIterator , qui sont utilisées pour générer des données sous forme de tableau Objet d'opération. Dans le même temps, vous pouvez également utiliser d'autres itérateurs tels que RecursiveIterator et ArrayObejcts pour itérer les données.
Il possède également plusieurs objets intégrés tels que Exceptions, SplObserver, Spltorage et splautoloadregister, splclasses Les fonctions d'assistance de , iteratorapply , etc. sont utilisées pour surcharger les fonctions correspondantes.
Ces outils réunis sont comme un couteau suisse multifonctionnel. Faire bon usage d’eux peut améliorer qualitativement l’efficacité du code PHP. Alors, comment libérer sa puissance ?
Chargeur automatique de surcharge
Si vous êtes un "programmeur de manuels", alors vous êtes assuré de savoir comment utiliser autoload
pour remplacer inclut /requires fonctionne pour charger paresseusement la classe correspondante, n'est-ce pas ?
Mais au fil du temps, vous constaterez que vous avez eu des ennuis. Tout d'abord, vous devez vous assurer que vos fichiers de classe doivent se trouver dans le chemin de fichier spécifié. Par exemple, dans le framework Zend, vous devez utiliser "_. " pour séparer les classes. Nom de la méthode (Comment résolvez-vous ce problème ?).
Un autre problème est qu'à mesure que le projet devient de plus en plus complexe, la logique au sein de autoload
deviendra également d'autant plus complexe. En fin de compte, vous ajouterez même un jugement d'exception et y écrirez toute la logique de chargement des classes.
Tout le monde sait que "les œufs ne peuvent pas être mis dans le même panier", et SPL peut être utilisé pour séparer la logique de chargement de autoload
. Écrivez simplement votre propre fonction de chargement automatique et surchargez-la en utilisant les fonctions fournies par SPL.
Par exemple, dans le problème du framework Zend mentionné ci-dessus, vous pouvez surcharger la méthode correspondante du chargeur Zend. S'il ne trouve pas la classe correspondante, alors il utilisera la fonction que vous avez définie précédemment.
<?php class MyLoader { public static function doAutoload($class) { // 本模块对应的 autoload 操作 } } spl_autoload_register( array('MyLoader', 'doAutoload') ); ?>
Comme vous pouvez le voir, spl_autoload_register
peut également ajouter plusieurs logiques de chargement sous la forme d'un tableau. En même temps, vous pouvez également utiliser spl_autoload_unregister
pour supprimer la logique de chargement qui n'est plus nécessaire. Cette fonctionnalité sera toujours utilisée.
Itérateur
L'itération est l'un des modèles de conception courants et est couramment utilisée pour les opérations de parcours unifiées dans un ensemble de données. Il n'est pas exagéré de dire que SPL fournit tous les itérateurs dont vous avez besoin correspondant au type de données .
Un très bon exemple est le parcours de répertoires. L'approche conventionnelle consiste à utiliser scandir
, puis à ignorer "." et "..", ainsi que les autres fichiers qui ne remplissent pas les conditions. Par exemple, si vous devez parcourir un répertoire pour extraire des fichiers image, vous devez déterminer s'ils se terminent par jpg ou gif.
Le code suivant est un exemple d'utilisation de l'itérateur de SPL pour effectuer la recherche récursive ci-dessus de fichiers image dans le répertoire spécifié :
<?php class RecursiveFileFilterIterator extends FilterIterator { // 满足条件的扩展名 protected $ext = array('jpg','gif'); /** * 提供 $path 并生成对应的目录迭代器 */ public function construct($path) { parent::construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path))); } /** * 检查文件扩展名是否满足条件 */ public function accept() { $item = $this->getInnerIterator(); if ($item->isFile() && in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) { return TRUE; } } } // 实例化 foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) { echo $item . PHP_EOL; } ?>
Vous pouvez dire que ce n'est pas plus de code. faire la même chose ? Alors, regardez le code ci-dessus, n'avez-vous pas un code hautement réutilisable et testable :)
?Voici d'autres itérateurs fournis par SPL :
RecursiveIterator
RecursiveIteratorIterator
OuterIterator
IteratorIterator
FilterIterator
RecursiveFilterIterator
ParentIterator
SeekableIterator
LimitIterator
GlobIterator
CachingIterator
RecursiveCachingIterator
NoRewindIterator
AppendIterator
RecursiveIteratorIterator
InfiniteIterator
Regex Itérateur
RecursiveRegexIterator
EmptyIterator
RecursiveTreeIterator
ArrayIterator
À partir de PHP5.3, il y aura plus d'itérateurs intégrés, je pense que vous pouvez les essayer. Peut-être que cela changera votre façon d'écrire du code traditionnel. Habitude.
SplFixedArray
SPL dispose également d'une série d'outils de manipulation de tableaux intégrés. Par exemple, vous pouvez utiliser SplFixedArray pour instancier un tableau de longueur fixe. Alors pourquoi l'utiliser ? Parce que c'est plus rapide, c'est même lié à votre salaire :)
Nous savons que les tableaux réguliers PHP contiennent différents types de clés, comme des nombres, des chaînes, etc., et la longueur est variable. C'est précisément à cause de ces "fonctionnalités avancées" que PHP utilise un hachage pour obtenir la valeur correspondante via la clé - en fait, cela peut entraîner des problèmes de performances dans certaines situations.
Étant donné que SplFixedArray utilise des touches numériques fixes, il n'utilise pas de stockage de hachage. Pas exactement, vous pouvez même le considérer comme un tableau C. C'est pourquoi SplFixedArray est plus rapide que les tableaux classiques (uniquement en PHP5.3).
À quelle vitesse est-il ? L'ensemble de données suivant peut vous en donner un aperçu.
Si vous avez besoin de beaucoup d'opérations sur les tableaux, vous pouvez l'essayer et je pense qu'il est digne de confiance.
Structure des données
Dans le même temps, SPL fournit également la mise en œuvre de certains types de base de structures de données. Bien que nous puissions utiliser des types de variables traditionnels pour décrire des structures de données, comme l'utilisation de tableaux pour décrire des piles (Strack) - puis utiliser les méthodes pop et push correspondantes (arraypop()
, arraypush()
), vous devez toujours être prudent , car Après tout, ils ne sont pas spécifiquement conçus pour décrire des structures de données - une seule mauvaise opération peut corrompre la pile.
L'objet SplStack de SPL décrit strictement les données sous forme de pile et fournit les méthodes correspondantes. Dans le même temps, un tel code devrait également être capable de comprendre qu'il fonctionne sur une pile plutôt que sur un tableau, permettant à vos pairs de mieux comprendre le code correspondant, et ce sera plus rapide.
Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !
Lecture recommandée :
Explication détaillée des étapes d'encodage/décodage de Huffman en PHP
Analyse de cas de tri par insertion directe PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!