


Explication détaillée du mécanisme de chargement automatique du compositeur
La colonne tutorielle suivante de composer présentera le mécanisme de chargement automatique du compositeur de superficiel à profond. J'espère qu'il sera utile aux amis dans le besoin !
Avant-propos
Parce que pour composer automatiquement La seule mémoire restante dans le mécanisme de chargement est "spl_auto???" et "dérivation des chemins de fichiers en fonction de l'espace de noms". . . Encore incomplet. .
Je voulais enregistrer une explication détaillée en ligne, mais je n'ai pas trouvé d'article "du simple au profond" qui corresponde à mon opinion.
Voici donc cette note.
Les points de connaissances suivants seront bientôt disponibles :
1. En savoir plus sur spl_autoload_register
2 L'histoire de la mise à jour du compositeur
3. Suivez le chargement automatique du compositeur
Texte.
1. En savoir plus sur spl_autoload_register
Vérifiez d'abord le manuel php officiel :
(Vous pouvez simplement regarder la partie rouge si vous êtes paresseux)
Est-ce vrai ?
Traduisons-le en langue vernaculaire :
Si nous créons une nouvelle classe, nous devons d'abord exiger ou inclure le fichier de classe. S'il n'est pas chargé, une erreur sera signalée. Cela crée un problème : dans ce cas, l'en-tête du fichier est plein d'exigences et d'inclusions, ce qui n'est évidemment pas conforme au besoin d'être « paresseux » du programmeur.
Afin de créer normalement une nouvelle classe sans nécessiter ni inclure de fichiers de classe, un mécanisme de chargement automatique a émergé. La fonction spl_autoload_register est spécialement conçue pour cela.
D'après la capture d'écran, nous savons que cette fonction a trois paramètres :
参数 | 详解 |
---|---|
autoload_function | 这里填的是一个***"函数"的名称***,字符串或者数组,这个函数的功能就是把需要new的文件require或者include尽量,避免new的时候报错。简单的说就是要你封装一个***自动加载文件的函数*** |
throw | 当自动加载的函数无法注册的时候,是否抛异常 |
prepend | 是否添加函数到函数队列之首,如果是true则为首,否则尾部 |
来一波代码,印象深刻一些:
//文件 testClass.php ,即将new的类 class TestClass{ public function __construct() { echo '你已经成功new了我了'; } } //文件autoloadDemo.php文件 spl_autoload_register('autoLoad_function', true, true); function autoLoad_function($class_name){ echo "所有的require或者include文件工作都交给我吧!\r\n"; $class_filename = "./{$class_name}.php"; echo "我来加载{$class_filename}文件\r\n"; require_once("./{$class_name}.php"); } $obj_demo = new TestClass();
输出:
所有的require或者include文件工作都交给我吧! 我来加载testClass.php文件 你已经成功new了我了
明白了这个加载的原理,看下文就顺利多了。
2.composer update发生的故事
将自动加载之前,必须要先说一下composer update,这里头承载了自动加载的前提。
composer项目都包含一个composer.json的配置文件。
这里头有一个关键的字段"autoload",包含psr-4和files两个字段。
psr-4:说明是基于psr-4规范的类库,都支持自动加载,只要在后面的对象中以**“命名空间:路径”**的方式写入自己的类库信息即可。
files:这就就更直接了,写入路径就自动加载。
按照以上配置每回composer update之后呢,都会更新一个很重要的文件:./vender/composer/autoload_psr4.php。
这个文件只做了一件事情:把命名空间和文件路径对应起来,这样后续自动加载就有映射根据了。
3.追踪一下composer的自动加载
composer的故事从唯一的一个require说起:
require '../vendor/autoload.php'
这个脚本执行了一个函数:
ComposerAutoloaderInitd9b31141b114fcbee3cf55d0e97b7f87::getLoader()
继续跟getloader函数做了什么?
public static function getLoader() { if (null !== self::$loader) { return self::$loader; } spl_autoload_register(array('ComposerAutoloaderInitd9b31141b114fcbee3cf55d0e97b7f87', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInitd9b31141b114fcbee3cf55d0e97b7f87', 'loadClassLoader')); $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInitd9b31141b114fcbee3cf55d0e97b7f87::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); if ($useStaticLoader) { $includeFiles = Composer\Autoload\ComposerStaticInitd9b31141b114fcbee3cf55d0e97b7f87::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { composerRequired9b31141b114fcbee3cf55d0e97b7f87($fileIdentifier, $file); } return $loader; }
这个函数主要做了两件事情:
1.将各种存有命名空间和文件映射关系的文件autoload_xxx.php加载了进来,并作了一些处理(比如:setPsr4将相关映射加载了进去,这个留意下,下文会有呼应。)。
2.注册了函数register
继续跟踪register做了什么:
public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); }
原来调用了spl_autoload_register函数,当类没加载的时候使用loadClass来加载类。(这个前文讲的很清楚了,应该很熟了)
继续跟踪loadClass实现:
public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } }
大概可以看出,是做了文件的include。
继续跟踪下是怎么查找文件的,看findFile函数:
public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; }
这个函数做了一件事:就是寻找类从上文的autoload_xxx.php初始化的数据中来寻找映射的文件路径。
其中这个函数findFileWithExtension,适用于寻找psr-4规范的文件的映射信息的。
继续跟踪findFileWithExtension:
private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath.'\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; }
这个函数做了件事:将命名空间\类这样的类名,转换成目录名/类名.php这样的路径,再从前文setPsr4设置的映射信息中寻找映射信息,然后完成返回路径。
至此composer的自动加载机制结束。
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Composer fournit des fonctionnalités avancées, notamment : 1. Alias : définissez des noms pratiques pour les packages pour référence répétée ; 2. Scripts : exécutez des commandes personnalisées lors de l'installation/mise à jour de packages, utilisées pour créer des tables de base de données ou compiler des ressources ; 3. Résolution de conflits : utilisez des règles de priorité ; , les contraintes de satisfaction et les alias de package résolvent les différentes exigences de plusieurs packages pour la même version de dépendance afin d'éviter les conflits d'installation.

Comment convertir un tableau PHP en objet : utilisez la classe stdClass, utilisez la fonction json_decode(), utilisez une bibliothèque tierce (telle que la classe ArrayObject, la bibliothèque Hydrator)

Réponse : Les microservices PHP sont déployés avec HelmCharts pour un développement agile et conteneurisés avec DockerContainer pour l'isolation et l'évolutivité. Description détaillée : utilisez HelmCharts pour déployer automatiquement des microservices PHP afin de réaliser un développement agile. Les images Docker permettent une itération rapide et un contrôle de version des microservices. Le standard DockerContainer isole les microservices et Kubernetes gère la disponibilité et l'évolutivité des conteneurs. Utilisez Prometheus et Grafana pour surveiller les performances et l'état des microservices, et créer des alarmes et des mécanismes de réparation automatiques.

Contrôle de version du code PHP : Il existe deux systèmes de contrôle de version (VCS) couramment utilisés dans le développement PHP : Git : VCS distribué, où les développeurs stockent localement des copies de la base de code pour faciliter la collaboration et le travail hors ligne. Subversion : VCS centralisé, la seule copie de la base de code est stockée sur un serveur central, offrant plus de contrôle. VCS aide les équipes à suivre les modifications, à collaborer et à revenir aux versions antérieures.

PHPCI/CD est une pratique clé dans les projets DevOps qui automatise les processus de création, de test et de déploiement, améliorant ainsi l'efficacité du développement et la qualité des logiciels. Un pipeline PHPCI/CD typique comprend les étapes suivantes : 1) Intégration continue : chaque fois que le code change, le code est automatiquement construit et testé. 2) Déploiement continu : accélérez la livraison en déployant automatiquement le code testé et intégré dans l'environnement de production. En mettant en œuvre le pipeline PHPCI/CD, vous pouvez augmenter l’efficacité du développement, améliorer la qualité des logiciels, réduire les délais de mise sur le marché et augmenter la fiabilité.

L'utilisation du cache Redis peut considérablement optimiser les performances de la pagination du tableau PHP. Cela peut être réalisé en suivant les étapes suivantes : Installez le client Redis. Connectez-vous au serveur Redis. Créez des données de cache et stockez chaque page de données dans un hachage Redis avec la clé « page : {page_number} ». Récupérez les données du cache et évitez les opérations coûteuses sur les grandes baies.

Il existe trois technologies principales pour visualiser les structures de données en PHP : Graphviz : un outil open source capable de créer des représentations graphiques telles que des graphiques, des graphiques acycliques dirigés et des arbres de décision. D3.js : bibliothèque JavaScript pour créer des visualisations interactives basées sur les données, générer du HTML et des données à partir de PHP, puis les visualiser côté client à l'aide de D3.js. ASCIIFlow : une bibliothèque pour créer une représentation textuelle de diagrammes de flux de données, adaptée à la visualisation de processus et d'algorithmes.

Réponse : Utilisez PHPCI/CD pour réaliser une itération rapide, y compris la configuration de pipelines CI/CD, de tests automatisés et de processus de déploiement. Configurer un pipeline CI/CD : sélectionnez un outil CI/CD, configurez le référentiel de code et définissez le pipeline de build. Tests automatisés : rédigez des tests unitaires et d'intégration et utilisez des frameworks de test pour simplifier les tests. Cas pratique : Utilisation de TravisCI : Installez TravisCI, définissez le pipeline, activez le pipeline et visualisez les résultats. Mettez en œuvre la livraison continue : sélectionnez les outils de déploiement, définissez les pipelines de déploiement et automatisez le déploiement. Avantages : améliorez l’efficacité du développement, réduisez les erreurs et raccourcissez les délais de livraison.
