Lassen Sie mich zunächst erklären, was ein Namespace ist.
„Was ist ein Namespace? Im Großen und Ganzen ist ein Namespace eine Möglichkeit, Dinge zu kapseln. Dieses abstrakte Konzept kann an vielen Stellen gesehen werden. Beispielsweise werden in Betriebssystemen Verzeichnisse verwendet, um zusammengehörige Dateien zu gruppieren. Für Verzeichnisse Für Dateien wird es abgespielt die Rolle eines Namespaces. foo.txt kann gleichzeitig in den Verzeichnissen /home/greg und /home/other vorhanden sein, zwei foo.txt können jedoch nicht im selben Verzeichnis vorhanden sein dokumentieren. Darüber hinaus müssen wir beim Zugriff auf die Datei foo.txt außerhalb des Verzeichnisses /home/greg den Verzeichnisnamen und das Verzeichnistrennzeichen vor den abzurufenden Dateinamen setzen /home/greg/foo.txt. Die Anwendung dieses Prinzips auf den Bereich der Programmierung ist das Konzept des Namespace. ”
Das automatische Laden von PHP bedeutet, dass wir beim Laden einer instanziierten Klasse nicht manuell „require“ schreiben müssen, um die Datei „class.php“ zu importieren. Das Programm lädt und importiert sie automatisch für uns. Mit der Namespace-Spezifikation können wir das Laden und Aufrufen verschiedener Klassen in komplexen Systemen problemlos bewältigen.
1. Das Prinzip des automatischen Ladens und die Verwendung von __autoload
Das Prinzip des automatischen Ladens besteht darin, dass PHP beim Instanziieren einer Klasse die Klasse automatisch aufruft, wenn sie die Klasse nicht finden kann __autoload($class_name)-Methode, unser neuer Klassenname Es wird zum Parameter dieser Methode. Daher können wir bei dieser Methode new entsprechend unseren Anforderungen verwenden Verschiedene Beurteilungen und Unterteilungen von Klassennamen erfordern die entsprechende Pfadklassendatei, um ein automatisches Laden zu erreichen.
Schauen wir uns zunächst den automatischen Aufruf von __autoload() als Beispiel an:
index.php
<?php $db = new Db();
Wenn wir die Db-Klasse nicht manuell importieren, meldet das Programm möglicherweise einen Fehler, der besagt, dass diese Klasse nicht gefunden werden kann:
Schwerwiegender Fehler: Nicht erfasster Fehler: Klasse „DB“ nicht gefunden in D:webhellowebademo2017autoloadindex.php:2 Stacktrace: #0 {main} geworfen in D:webhellowebademo2017autoloadindex.php in Zeile 2
Fügen wir jetzt also die Methode __autoload() hinzu und werfen einen Blick darauf:
$db = new DB(); function __autoload($className) { echo $className; exit(); }
Gemäß der obigen Beschreibung des automatischen Lademechanismus lautet die Ausgabe: Db, der Klassenname der Klasse, die wir neu benötigen. Daher können wir zu diesem Zeitpunkt die Klassenbibliotheksdatei nach Bedarf in der Methode __autoload() laden.
2. spl_autoload_register lädt automatisch
Wenn es sich um ein kleines Projekt handelt, verwenden Sie __autoload() Es kann ein grundlegendes automatisches Laden erreicht werden. Wenn ein Projekt jedoch sehr groß ist oder unterschiedliche automatische Ladevorgänge erforderlich sind, um Dateien mit unterschiedlichen Pfaden zu laden, ist __autoload nutzlos, da in einem Projekt nur einer zulässig ist. __autoload()-Funktion, da PHP keine Funktionen mit doppelten Namen zulässt, was bedeutet, dass Sie nicht zwei __autoload()-Funktionen deklarieren können Funktionsdatei, andernfalls wird ein schwerwiegender Fehler gemeldet. Was zu tun? Machen Sie sich keine Sorgen, was auch immer Ihnen einfällt, der PHP-Meister hat bereits darüber nachgedacht. Also spl_autoload_register() Auf diese Weise wurde eine weitere großartige Funktion geboren, die diese ersetzte. Es arbeitet effizienter und ist flexibler.
Sehen wir uns zunächst an, wie man es verwendet. Fügen Sie den folgenden Code zu index.php hinzu.
<?php spl_autoload_register(function($className){ if (is_file('./Lib/' . $className . '.php')) { require './Lib/' . $className . '.php'; } }); $db = new Db(); $db::test();
Fügen Sie der Datei LibDb.php den folgenden Code hinzu:
<?php class Db { public static function test() { echo 'Test'; } }
Nach dem Ausführen von index.php wird spl_autoload_register aufgerufen, wenn new Db() aufgerufen wird Es wird automatisch in das lib/-Verzeichnis gewechselt, um die entsprechende Db.php-Datei zu finden. Nach Erfolg kann $db::test(); ausgeführt werden. . Wenn sich im Lib-Verzeichnis mehrere PHP-Klassendateien befinden, können diese ebenfalls direkt in index.php aufgerufen werden, ohne dass mehrere Dateien erforderlich sind.
Mit anderen Worten, spl_autoload_register kann mehrmals wiederverwendet werden. Wenn eine Seite mehrere spl_autoload_register hat, erfolgt die Ausführung nacheinander.
3. spl_autoload_register automatisches Laden und Namespace-Namespace
Bei sehr komplexen Systemen ist auch die Verzeichnisstruktur sehr komplex. Der standardisierte Namespace löst das Problem einer großen Anzahl von Dateien, Funktionen und Klassen mit doppelten Namen unter komplexen Pfaden. Autoloading ist heute im Grunde der Grundstein moderner PHP-Frameworks spl_autoload_register zum Implementieren des automatischen Ladens. Also spl_autoload_register + Namespace Es wurde zum Mainstream.
Gemäß der PSR-Spezifikationsreihe wurde die Benennung von Namespaces stark standardisiert, sodass der detaillierte Pfad anhand des Namespace ermittelt werden kann, um die Klassendatei zu finden.
Anhand des einfachsten Beispiels veranschaulichen wir, wie komplexe Systeme Klassendateien automatisch laden.
Zuerst bereiten wir die Systemverzeichnisstruktur vor:
----/Lib // 类目录 --Db.php --Say.php ----autoload.php // 自动加载函数 ----index.php // 首页
Das Obige ist ein grundlegendes Systemverzeichnis. Was wir erreichen möchten, ist die Verwendung von Namespace und automatischem Laden, um mehrere Klassen im Lib-Verzeichnis auf der Homepage index.php direkt aufzurufen.
Wir bereiten zwei Spaltendateien vor:
Db.php
<?php namespace Lib; class Db { public function __construct() { //echo 'Hello Db'; } public static function test() { echo 'Test'; } } Say.php <?php namespace Lib; class Say { public function __construct() { //echo 'Hello'; } public function hello() { echo 'say hello'; } }
以上两个普通的类文件,添加了命名空间: namespace Lib; 表示该类文件属于Lib目录名称下的,当然你可以随便取个不一样的名字来表示你的项目名称。
现在我们来看autoload.php:
<?php spl_autoload_register(function ($class) { $prefix = 'Lib\\'; $base_dir = __DIR__ . '/Lib/'; // does the class use the namespace prefix? $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { // no, move to the next registered autoloader return; } $relative_class = substr($class, $len); // 兼容Linux文件找。Windows 下(/ 和 \)是通用的 $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; if (file_exists($file)) { require $file; } });
以上代码使用函数 spl_autoload_register() 首先判断是否使用了命名空间,然后验证要调用的类文件是否存在,如果存在就 require 类文件。
好了,现在我们在首页index.php这样调用:
<?php use Lib\Db; use Lib\Say; require './autoload.php'; $db = new Db(); $db::test(); $say = new Say; $say->hello();
我们只需使用一个require将autoload.php加载进来,使用 use 关键字将类文件路径变成绝对路径了,当然你也可以在调用类的时候把路径都写上,如: new LibDb(); ,但是涉及到多个类互相调用的时候就会很棘手,所以我们还是在文件开头就使用 use 把路径处理好。
接下来就直接调用Lib/目录下的各种类文件了,你可以在Lib/目录下放置多个类文件尝试下。
运行index.php看看是不是如您所愿。
结束语
该文简单介绍了自动加载以及命名空间的使用,实际开发中,我们很少去关注autoload自动加载的问题,因为大多数现代PHP框架都已经处理好了文件自动加载的问题。开发者只需关注业务代码,使用规范的命名空间就可以了。当然,如果你想自己开发个项目不依赖大型框架亦或者自己开发php框架,那你就得熟悉下autoload自动加载这个好东西了,毕竟它可以让我们“偷懒”,省事多了。
现代php里,我们经常使用 Composer 方式安装的组件,都可以通过autoload实现自动加载,所以还是一个“懒”字给我们带来了极好的开发效率。
Das obige ist der detaillierte Inhalt vonAutomatisches Laden von PHP und Zusammenfassung der Namespace-Anwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!