Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in das Prinzip des automatischen Ladens von PHP

Detaillierte Einführung in das Prinzip des automatischen Ladens von PHP

王林
王林Original
2019-09-02 16:55:075361Durchsuche

Detaillierte Einführung in das Prinzip des automatischen Ladens von PHP

Apropos automatisches Laden von PHP: Viele Schüler denken vielleicht an die automatischen Ladefunktionen verschiedener Frameworks, die PSR0- und PSR4-Prinzipien in der PHP-Spezifikation, die automatische Ladefunktion von Composer usw. Alle bieten großen Komfort für unsere Entwicklung.

Was sind also die Ursachen und Folgen des automatischen Ladens von PHP? Was sind die internen Prinzipien von PHP? Als nächstes werde ich basierend auf meinem eigenen Verständnis analysieren und zusammenfassen:

Warum gibt es automatisches Laden?

Um die Verwaltung zu erleichtern, schreiben wir bei der objektorientierten PHP-Programmierung (OO) eine Klasse in eine separate Datei, wenn wir sie dann in der Klasse verwenden möchten A Die Funktion von Klasse B erfordert das Laden von Klasse B in Klasse A. Ursprünglich haben wir solche Anforderungen durch die Syntax „require“ und „include“ implementiert. Die Ergebnisse dieser beiden Syntaxen sind im Wesentlichen gleich. Es gibt einige Unterschiede im Ausführungsprozess, die hier nicht erläutert werden. Zum Beispiel:

//文件 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中的方法执行结果“

Daher implementiert PHP5 die automatische Ladefunktion (Autoload) von Klassen. Diese Funktion wurde ursprünglich durch eine magische Methode __autoload() in PHP implementiert. Später implementierte die PHP-Erweiterung SPL (Standard PHP Library) einen leistungsfähigeren automatischen Lademechanismus.

php original automatisches Laden

Lassen Sie uns zunächst die Methode __autoload() vorstellen. Wenn Sie das Beispiel gerade noch verwenden, können Sie mit __autoload() die folgenden Änderungen vornehmen:

//文件 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中的方法执行结果“

Wir haben der Datei A eine Funktion hinzugefügt: __autoload() und nach dem Ausführen die entsprechende Einführungsmethode in die Funktion geschrieben Es wurde das gleiche Ergebnis erzielt, es wurde kein Fehler gemeldet. Wir müssen klarstellen, dass die Funktion __autoload() automatisch ausgeführt wird, wenn die Klasse nicht gefunden wird. Diese Funktion ist jedoch nicht intern in PHP definiert. Diese Funktion muss vom Entwickler selbst definiert und die interne Logik geschrieben werden. PHP ist nur für die automatische Ausführung des Aufrufs verantwortlich. Und beim Aufruf wird automatisch der Name der zu ladenden Klasse als Parameter übergeben.

Mit der Funktion __autoload() ist ersichtlich, dass wir, wenn wir jetzt 100 weitere Dateien einführen müssen, nur eine Regel festlegen und eine Funktion schreiben müssen. Dies ist eine große Verbesserung gegenüber der direkten Verwendung von require/inlude, es gibt jedoch auch neue Probleme. In einem Projekt können wir nur eine __autoload()-Funktion schreiben. Wenn das Projekt relativ groß ist, werden zum Laden jeder Datei dieselben Regeln verwendet . Offensichtlich ist es unrealistisch, dann müssen wir möglicherweise eine komplexe Regellogik in __autoload() schreiben, um den Anforderungen beim Laden verschiedener Dateien gerecht zu werden. Dadurch wird auch die Funktion __autoload() komplex und aufgebläht, was ihre Wartung und Verwaltung erschwert.

Als Ergebnis entstand der automatische Lademechanismus von SPL (Standard PHP Library Standard PHP Library).

Automatisches Laden von SPL

Lassen Sie uns zunächst klarstellen, wann PHP ein Objekt instanziiert (tatsächlich implementiert). Schnittstelle verwendet Klassenkonstanten oder statische Variablen in der Klasse. Dies ist der Fall, wenn statische Methoden in der Klasse aufgerufen werden. Zunächst wird geprüft, ob die Klasse (oder Schnittstelle) im System vorhanden ist. Wenn sie nicht vorhanden ist, wird sie überprüft Ich werde versuchen, den Autoload-Mechanismus zum Laden der Klasse zu verwenden. Der Hauptausführungsprozess des Autoload-Mechanismus ist:

1. Überprüfen Sie, ob der globale Variablenfunktionszeiger autoload_func NULL ist > 2. Wenn autoload_func==NULL, prüfen Sie, ob das System die Funktion __autoload() definiert. Wenn sie definiert ist, führen Sie sie aus und geben Sie das Ladeergebnis zurück. Wenn es nicht definiert ist, wird ein Fehler gemeldet und beendet.

3 Wenn autoload_func nicht gleich NULL ist, wird die Funktion, auf die autoload_func verweist, direkt ausgeführt prüft nicht, ob die Funktion __autoload() definiert ist.

Wenn Sie den automatischen Ladevorgang von PHP verstehen, können Sie erkennen, dass PHP tatsächlich zwei Methoden zum Implementieren des automatischen Lademechanismus bereitstellt:

Eine, die wir zuvor erwähnt haben, ist die Verwendung des vom Benutzer definierten __autoload( )-Funktion wird normalerweise im PHP-Quellprogramm implementiert; die andere besteht darin, eine Funktion zu entwerfen und den autoload_func-Zeiger darauf zu verweisen, was normalerweise in der PHP-Erweiterung unter Verwendung der C-Sprache implementiert wird, also des SPL-Autoload-Mechanismus.

Wenn beide Methoden implementiert sind, das heißt, autoload_func ist nicht gleich NULL, führt das Programm nur die zweite Methode aus und die Funktion __autoload() wird nicht ausgeführt.

Sehen wir uns zunächst ein Beispiel für das automatische Laden von SPL an:

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中的方法执行结果
?>

In diesem kleinen Beispiel können Sie sehen, dass über spl_autoload_register ('my_autoload') die Programmausführung die Klasse B nicht finden kann Die angepasste my_autoload()-Funktion wird ausgeführt, um Klasse B zu laden. Tatsächlich besteht die Funktion von spl_autoload_register('my_autoload') darin, den autoload_func-Zeiger auf my_autoload() zu verweisen. Jetzt wird der gesamte PHP-Autoloading-Prozess klar.

Detaillierte Analyse des automatischen SPL-Ladevorgangs

Nehmen wir zunächst das kleine Beispiel, wenn Sie spl_autoload_register(' ändern. my_autoload') bis spl_autoload_register() Kann Klasse B geladen werden, ohne Parameter hinzuzufügen? Die Antwort lautet: JA. Warum?

因为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() //注销自动加载函数

以上便是php自动加载原理的全部介绍,想了解更多相关内容请访问PHP中文网:PHP视频教程

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in das Prinzip des automatischen Ladens von PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn