PHPs Mechanismus zum automatischen Laden von KlassenEine Klasse verwendet normalerweise die Methoden include und require, um die Datei einzuschließen, die die Klasse definiert. Wenn dies im kleinen Maßstab entwickelt wird, gibt es kein großes Problem. In großen Entwicklungsprojekten führt dies jedoch zu einer großen Anzahl von Methodenaufrufen „require“ oder „include“, was nicht nur die Effizienz verringert, sondern auch die Wartung des Codes erschwert. Darüber hinaus ist require_once
sehr teuer .
Wenn vor PHP5 jedes PHP-Framework das automatische Laden von Klassen implementieren wollte, implementierten sie normalerweise eine Verzeichnisdurchquerung gemäß einer bestimmten Vereinbarung und Automatisch Eine Klasse oder Funktion, die alle Dateien lädt, die den vereinbarten Regeln entsprechen. Natürlich war die objektorientierte Unterstützung vor PHP5 nicht sehr gut und die Verwendung von Klassen war nicht so häufig wie heute. Wenn nach PHP5 beim Laden einer PHP-Klasse die Datei, in der sich die Klasse befindet, nicht enthalten ist oder der Klassenname falsch ist, ruft die Zend-Engine automatisch die Autoload-Funktion auf. Für diese Funktion müssen Benutzer die Autoload-Funktion selbst implementieren. Nach der PHP5.1.2-Version können Sie die Funktion spl_autoload_register verwenden, um die automatische Ladeverarbeitungsfunktion anzupassen. Wenn diese Funktion nicht aufgerufen wird, wird standardmäßig die benutzerdefinierte spl_autoload-Funktion von SPL verwendet.
1. Autoload-Beispiel: Der obige Code wird am Ende ausgegeben: autoload class:Demo. Und danach wird ein Fehler gemeldet: Schwerwiegender Fehler: Klasse „Demo“ nicht gefunden
Wir verwenden im Allgemeinen _autoload
, um Klassenfunction autoload($class_name) { echo 'autload class:', $class_name, '<br />'; } new Demo();
<?php function autoload($class_name) { require_once ($class_name . “class.php”); } $memo= new Demo();
eine neue Lösung, die Funktion spl_autoload_register().
2. Funktion spl_autoload_register() Die Funktion dieser Funktion besteht darin, die Funktion im SPL-Autoload-Funktionsstapel zu registrieren und das Standard-Autoload des Systems zu entfernen ( )Funktion. Dies ist im folgenden Beispiel zu sehen:
function autoload($class_name) { echo 'autload class:', $class_name, '<br />'; } function classLoader($class_name) { echo 'SPL load class:', $class_name, '<br />'; } spl_autoload_register('classLoader'); new Test();//结果:SPL load class:Test
语法:bool spl_autoload_register ( [callback $autoload_function] ) 接受两个参数:一个是添加到自动加载栈的函数,另外一个是加载器不能找到这个类时是否抛出异常的标志。第一个参数是可选的,并且默认指向spl_autoload()函数,这个函数会自动在路径中查找具有小写类名和.php扩展或者.ini扩展名,或者任何注册到spl_autoload_extensions()函数中的其它扩展名的文件。
<?php class CalssLoader { public static function loader($classname) { $class_file = strtolower($classname).".php"; if (file_exists($class_file)){ require_once($class_file); } } } // 方法为静态方法 spl_autoload_register('CalssLoader::loader'); $test = new Test();
一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用autoload()函数。如果要避免这种情况,需采用一种更加安全的spl_autoload_register()函数的初始化调用方法:
if(false === spl_autoload_functions()){ if(function_exists('autoload')){ spl_autoload_registe('autoload',false); } }
spl_autoload_functions()函数会返回已注册函数的一个数组,如果SPL自动加载栈还没有被初始化,它会返回布尔值false。然后,检查是否有一个名为autoload()的函数存在,如果存在,可以将它注册为自动加载栈中的第一个函数,从而保留它的功能。之后,可以继续注册自动加载函数。
还可以调用spl_autoload_register()函数以注册一个回调函数,而不是为函数提供一个字符串名称。如提供一个如array('class','method')这样的数组,使得可以使用某个对象的方法。
下一步,通过调用spl_autoload_call('className')函数,可以手动调用加载器,而不用尝试去使用那个类。这个函数可以和函数class_exists('className',false)组合在一起使用以尝试去加载一个类,并且在所有的自动加载器都不能找到那个类的情况下失败。
f(spl_autoload_call('className') && class_exists('className',false)){ } else { }
SPL自动加载功能是由spl_autoload() ,spl_autoload_register(), spl_autoload_functions() ,spl_autoload_extensions()和spl_autoload_call()函数提供的。
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für den automatischen Lademechanismus der PHP-Klasse. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!