Maison développement back-end Problème PHP Introduction détaillée au principe du chargement automatique de php

Introduction détaillée au principe du chargement automatique de php

Sep 02, 2019 pm 04:55 PM
php 原理 自动加载

Introduction détaillée au principe du chargement automatique de php

En parlant du chargement automatique de PHP, de nombreux étudiants peuvent penser aux fonctions de chargement automatique de divers frameworks, aux principes PSR0 et PSR4 dans la spécification PHP, à la fonction de chargement automatique de Composer, etc. Tous offrent une grande commodité pour notre développement.

Alors quelles sont les causes et les conséquences du chargement automatique de PHP ? Quels sont les principes internes de PHP ? Ensuite, j'analyserai et résumerai en fonction de ma propre compréhension :

Pourquoi y a-t-il un chargement automatique ?

En programmation PHP orientée objet (OO), afin de faciliter la gestion, on va écrire une classe dans un fichier séparé, puis si on veut l'utiliser en classe A La fonction de classe B nécessite de charger la classe B dans la classe A. À l'origine, nous avons implémenté ces exigences via la syntaxe require et include. Les résultats de ces deux syntaxes sont fondamentalement les mêmes. Il existe certaines différences dans le processus d'exécution, qui ne seront pas expliquées ici. Par exemple :

//文件 B.php
<?php
class B{
    public function echo_info(){
        echo "我是class B中的方法执行结果";
    }
}
?>
//文件 A.php
<?php
require &#39;b.php&#39;;//include &#39;b.php&#39;;
class A{
    public function test(){
        $b_object = new B();
        $b_object->echo_info();
    }
}
$a_object = new A();
$a_oject->test();
?>
命令行输入:#php a.php
    输出: “我是class B中的方法执行结果“
Copier après la connexion

Par conséquent, PHP5 implémente la fonction de chargement automatique (Autoload) des classes. Cette fonction a été à l'origine implémentée via une méthode magique __autoload() en PHP. Plus tard, l'extension PHP SPL (Standard PHP Library) a implémenté un mécanisme de chargement automatique plus puissant.

Chargement automatique d'origine php

Tout d'abord, introduisons la méthode __autoload(). Toujours en utilisant l'exemple de tout à l'heure, vous pouvez utiliser __autoload() pour apporter les modifications suivantes :

//文件 B.php 不做修改
//文件 A.php
<?php
class A{
    public function test(){
        $b_object = new B();
        $b_object->echo_info();
    }
}
function __autoload($classname){
    require $classname.&#39;.php&#39;;//include &#39;b.php&#39;;
}
$a_object = new A();
$a_oject->test();
?>
命令行输入:#php a.php
    输出: “我是class B中的方法执行结果“
Copier après la connexion

Nous avons ajouté une fonction au fichier A : __autoload(), et avons écrit la méthode d'introduction correspondante dans la fonction après l'exécution. Le même résultat a été obtenu, aucune erreur n’a été signalée. Nous devons préciser que la fonction __autoload() PHP s'exécutera automatiquement lorsqu'elle ne trouvera pas la classe. Cependant, cette fonction n'est pas définie en interne dans PHP. Cette fonction doit être définie par le développeur lui-même et la logique interne écrite. PHP est uniquement responsable de son exécution automatique en cas de besoin. Et lors de l'appel, le nom de la classe à charger sera automatiquement passé en paramètre.

Avec la fonction __autoload(), on voit que si nous devons introduire 100 autres fichiers maintenant, il nous suffit de définir une règle et d'écrire une fonction. C'est une grande amélioration par rapport à l'utilisation directe de require/inlude, mais il y a aussi de nouveaux problèmes dans un projet, nous ne pouvons écrire qu'une seule fonction __autoload(). Si le projet est relativement volumineux, les mêmes règles seront utilisées pour charger chaque fichier. . Évidemment, ce n'est pas réaliste, nous devrons alors peut-être écrire une logique de règles complexe dans __autoload() pour répondre aux besoins de chargement de différents fichiers. Cela rendra également la fonction __autoload() complexe et gonflée, ce qui la rendra difficile à maintenir et à gérer.

En conséquence, le mécanisme de chargement automatique de SPL (Standard PHP Library Standard PHP Library) a vu le jour.

Chargement automatique SPL

Tout d'abord, soyons clairs, lorsque PHP instancie un objet (implémente en fait interface, en utilisant des constantes de classe ou des variables statiques dans la classe, ce sera le cas lors de l'appel de méthodes statiques dans la classe), il vérifiera d'abord si la classe (ou l'interface) existe dans le système, et si elle n'existe pas, elle va essayer d'utiliser le mécanisme de chargement automatique pour charger le genre de classe. Le processus d'exécution principal du mécanisme de chargement automatique est :

1 Vérifiez si le pointeur de fonction de variable globale de l'exécuteur autoload_func est NULL ; > 2. Si autoload_func==NULL, vérifiez si le système définit la fonction __autoload() Si elle est définie, exécutez-la et renvoyez le résultat du chargement. S'il n'est pas défini, une erreur sera signalée et quittera

3. Si autoload_func n'est pas égal à NULL, la fonction pointée par autoload_func sera exécutée directement pour charger la classe. ne vérifiera pas si la fonction __autoload() est définie.

En comprenant le processus de chargement automatique de PHP, vous pouvez voir que PHP fournit en fait deux méthodes pour implémenter le mécanisme de chargement automatique :

L'une que nous avons mentionnée précédemment consiste à utiliser l'utilisateur. Le __autoload défini ( ) la fonction est généralement implémentée dans le programme source PHP ;

L'autre consiste à concevoir une fonction et à pointer le pointeur autoload_func vers elle, qui est généralement implémentée dans l'extension PHP en utilisant le langage C, c'est-à-dire le mécanisme de chargement automatique SPL.

Si les deux méthodes sont implémentées, c'est-à-dire que autoload_func n'est pas égal à NULL, le programme n'exécutera que la deuxième méthode et la fonction __autoload() ne sera pas exécutée.

Regardons d'abord un exemple de chargement automatique SPL :

B.php文件不变
A.php
<?php
class A{
    public function test(){
        $b_object = new B();
        $b_object->echo_info();
    }
}

function __autoload($classname){
    require $classname.&#39;.php&#39;;//include &#39;b.php&#39;;
}

function my_autoload($classname){
    require $classname.&#39;.php&#39;;//include &#39;b.php&#39;;
    echo &#39;my_autoload   &#39;;
}

spl_autoload_register(&#39;my_autoload&#39;);
$a_object = new A();
$a_object->test();

结果:my_autoload  我是class B中的方法执行结果
?>
Copier après la connexion

Dans ce petit exemple, vous pouvez voir que grâce à spl_autoload_register ("my_autoload"), lorsque l'exécution du programme ne trouve pas la classe B, le La fonction my_autoload() personnalisée sera exécutée pour charger la classe B. En fait, la fonction de spl_autoload_register('my_autoload') est de pointer le pointeur autoload_func vers my_autoload(). Désormais, l’ensemble du processus de chargement automatique de PHP devient clair.

Analyse détaillée du processus de chargement automatique SPLTout d'abord, prenons le petit exemple de tout à l'heure If spl_autoload_register ('my_autoload'. ) est remplacé par spl_autoload_register() La classe B peut-elle être chargée sans ajouter de paramètres ? La réponse est : OUI.

Pourquoi ?

因为SPL扩展内部自己定义了一个自动加载函数 spl_autoload(),实现了自动加载的功能,如果我们不定义自己的自动加载函数,并且程序里写了 spl_autoload_register()(如果不传参数,必须是第一次执行才会有效)或者 spl_autoload_register(’spl_autoload’),那么autoload_func 指针就会指向内部函数 spl_autoload()。程序执行的时候如果找不到相应类就会执行该自动加载函数。

那么,SPL 是怎么实现autoload_func 指针指向不同的函数呢?

原来,在SPL内部定义了 一个函数 spl_autoload_call() 和 一个全局变量autoload_functions。autoload_functions本质上是一个HashTable,不过我们可以将其简单的看作一个链表,链表中的每一个元素都是一个函数指针,指向一个具有自动加载类功能的函数。

spl_autoload_call()的作用就是按顺序遍历 autoload_functions,使得autoload_func指向每个自动加载函数,如果加载成功就停止,如果不成功就继续遍历下个自动加载函数,直到加载成功或者遍历完所有的函数。

那么,autoload_functions 这个列表是谁来维护的呢?就是 spl_autoload_register() 这个函数。我们说的自动加载函数的注册,其实就是通过spl_autoload_register()把自动加载函数加入到 autoload_functions 列表。

到此为止,整个自动加载的流程就是分析结束了。

  相关SPL自动加载函数:
  spl_autoload_functions() //打印autoload_functions列表
  spl_autoload_unregister() //注销自动加载函数
Copier après la connexion

以上便是php自动加载原理的全部介绍,想了解更多相关内容请访问PHP中文网: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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

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

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

See all articles