recherche
Maisonoutils de développementcomposerExplication 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 !

Explication détaillée du mécanisme de chargement automatique du compositeur

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 :
Explication détaillée du mécanisme de chargement automatique du compositeur
(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的配置文件。
Explication détaillée du mécanisme de chargement automatique du compositeur
这里头有一个关键的字段"autoload",包含psr-4和files两个字段。

psr-4:说明是基于psr-4规范的类库,都支持自动加载,只要在后面的对象中以**“命名空间:路径”**的方式写入自己的类库信息即可。
files:这就就更直接了,写入路径就自动加载。

按照以上配置每回composer update之后呢,都会更新一个很重要的文件:./vender/composer/autoload_psr4.php。
Explication détaillée du mécanisme de chargement automatique du compositeur

这个文件只做了一件事情:把命名空间和文件路径对应起来,这样后续自动加载就有映射根据了。

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!

Déclaration
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Compositeur: rationalisation du développement du projet PHPCompositeur: rationalisation du développement du projet PHPApr 15, 2025 am 12:08 AM

Le compositeur simplifie les étapes de développement du projet PHP comprennent: 1) l'ajout de dépendances, comme l'ajout de "laravel / framework": "^ 8.0" dans composer.json; 2) Chargement automatiquement, générant un fichier Autoload.php en définissant l'espace de noms et ClassPath; 3) Optimisation des performances, en utilisant ComposerDump-Autoload-O et ComposeRinstall - No-Dev-Optimize-Autoloader Commandes. Grâce à ces étapes, les développeurs peuvent être plus efficaces et éviter les erreurs courantes.

Composer des informations d'identification: qu'est-ce qui fait de quelqu'un un compositeur?Composer des informations d'identification: qu'est-ce qui fait de quelqu'un un compositeur?Apr 14, 2025 am 12:13 AM

Les éléments clés de devenir compositeur comprennent: 1. Masterring Music Theory, 2. Être créatif et original, 3. Have Technical Skills, 4. Captiser d'exprimer des émotions et de raconter des histoires, 5. Comprendre les antécédents culturels et historiques, 6. Accumulant la pratique et l'expérience, ces éléments constituent ensemble l'identité et la capacité du compositeur.

Le chemin pour devenir compositeur: un guide pratiqueLe chemin pour devenir compositeur: un guide pratiqueApr 13, 2025 am 12:11 AM

Les étapes pour devenir compositeur comprennent: 1. Maître les éléments de base de la musique, tels que les notes, le rythme, l'harmonie et la mélodie; 2. Sélectionnez des outils techniques appropriés, comme AbleTonLive; 3. Comprendre le processus de composition, y compris l'acquisition d'inspiration, la conception, l'écriture, la modification et l'amélioration; 4. Commencez par la création de mélodie simple et essayez progressivement des techniques complexes telles que l'harmonie; 5. Résoudre des problèmes communs grâce à des techniques de débogage, telles que la sélection de notes et la disposition du rythme; 6. Appliquer l'optimisation des performances et les meilleures pratiques, telles que l'utilisation de modèles, le contrôle des versions et la collaboration.

Compositeur: La clé de la construction d'applications PHP robustesCompositeur: La clé de la construction d'applications PHP robustesApr 12, 2025 am 12:05 AM

Le compositeur est un outil clé pour construire des applications PHP robustes car elle simplifie la gestion des dépendances, améliore l'efficacité de développement et la qualité du code. 1) Composer définit les dépendances du projet via le fichier composer.json et télécharge automatiquement et gère ces dépendances. 2) Il génère un fichier composer.lock pour s'assurer que la version de dépendance est cohérente et chargée automatiquement via fournisseur / autoload.php. 3) Les exemples d'utilisation incluent l'utilisation de base tels que l'ajout de bibliothèques de journaux, ainsi que l'utilisation avancée telles que les contraintes de version et la gestion des variables d'environnement. 4) Les techniques de débogage des erreurs courantes comprennent la gestion des conflits de dépendance et des problèmes de réseau. 5) Les suggestions d'optimisation des performances incluent l'utilisation du fichier composer.lock et l'optimisation du chargement automatique.

Expertise des compositeurs: ce qui rend quelqu'un de compétenceExpertise des compositeurs: ce qui rend quelqu'un de compétenceApr 11, 2025 pm 12:41 PM

Pour devenir compétent lorsque vous utilisez Composer, vous devez maîtriser les compétences suivantes: 1. Compétions dans l'utilisation des fichiers composer.json et composer.

Que fait un compositeur?Que fait un compositeur?Apr 08, 2025 am 12:19 AM

Composer est un outil de gestion des dépendances pour PHP, utilisé pour déclarer, télécharger et gérer les dépendances du projet. 1) Déclarer les dépendances via le fichier composer.json, 2) Installez les dépendances à l'aide de ComposeRenstall Commande, 3) Analyser l'arborescence de dépendance et le télécharger à partir de Packagist, 4) Générez le fichier Autoload.php pour simplifier le chargement automatique, 5) Optimiser l'utilisation inclue à l'aide de ComposerUpdate - Prefer-Dist et ajustement de la configuration Autoload.

Qu'est-ce que App Composer?Qu'est-ce que App Composer?Apr 07, 2025 am 12:07 AM

AppComposer est un outil de création et de gestion des applications. 1) Il simplifie le développement d'applications et améliore l'efficacité en faisant glisser et configurer des composants prédéfinis. 2) Les développeurs peuvent définir des composants, combiner les interfaces, définir la logique métier et finalement rendre l'application. 3) Soutenez l'utilisation de base et avancée, telle que la gestion des tâches et le rendu conditionnel, aidant à créer des applications flexibles.

À quoi sert un compositeur?À quoi sert un compositeur?Apr 06, 2025 am 12:02 AM

Composer est un outil de gestion des dépendances pour PHP. Les étapes principales de l'utilisation du compositeur comprennent: 1) DÉCLARIER DES DÉPÉLENCES DANS COMPOSER.JSON, tels que "Stripe / Stripe-Php": "^ 7.0"; 2) Exécutez ComposeRrinstall pour télécharger et configurer les dépendances; 3) Gérer les versions et les autoloads via Composer.lock et Autoload.php. Le compositeur simplifie la gestion des dépendances et améliore l'efficacité du projet et la maintenabilité.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques moisBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques moisBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Version Mac de WebStorm

Version Mac de WebStorm

Outils de développement JavaScript utiles

Adaptateur de serveur SAP NetWeaver pour Eclipse

Adaptateur de serveur SAP NetWeaver pour Eclipse

Intégrez Eclipse au serveur d'applications SAP NetWeaver.

VSCode Windows 64 bits Télécharger

VSCode Windows 64 bits Télécharger

Un éditeur IDE gratuit et puissant lancé par Microsoft

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire