Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung von Beispielen für den automatischen Lademechanismus der PHP-Klasse

Detaillierte Erläuterung von Beispielen für den automatischen Lademechanismus der PHP-Klasse

伊谢尔伦
伊谢尔伦Original
2017-07-01 09:18:551348Durchsuche

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 Klassen
function autoload($class_name) {
   echo &#39;autload class:&#39;, $class_name, &#39;<br />&#39;;
}

new Demo();
wie folgt automatisch zu laden:


Wir können sehen, dass _autoload mindestens drei Dinge tun muss. Erstens muss der Klassendateiname anhand des Klassennamens ermittelt werden. Zweitens muss der Festplattenpfad ermittelt werden, in dem sich die Klassendatei befindet (Beispiel: Im einfachsten Fall befindet sich die Klasse im selben Ordner wie die PHP-Programmdateien, die sie aufrufen.) Der dritte Schritt besteht darin, die Klassen aus der Festplattendatei in das System zu laden. Der dritte Schritt ist der einfachste, verwenden Sie einfach include/require. Um die Funktionen des ersten und zweiten Schritts zu realisieren, muss während der Entwicklung die Zuordnungsmethode zwischen dem Klassennamen und der Festplattendatei vereinbart werden. Nur so können wir die entsprechende Festplattendatei anhand des Klassennamens finden.

Daher müssen wir bei einer großen Anzahl einzubindender Klassendateien nur die entsprechenden Regeln ermitteln und dann in der Funktion autoload() den Klassennamen mit der tatsächlichen Festplattendatei abgleichen, um dies zu erreichen Lazy-Loading-Effekt. Hier können wir auch erkennen, dass das Wichtigste bei der Implementierung der Funktion autoload() die Implementierung der Zuordnungsregeln zwischen dem Klassennamen und der tatsächlichen Festplattendatei ist.

Aber jetzt kommt das Problem: Wenn bei der Implementierung eines Systems viele andere Klassenbibliotheken verwendet werden müssen, können diese Klassenbibliotheken von verschiedenen Entwicklungsingenieuren entwickelt werden und ihre Klassennamen unterscheiden sich von den tatsächlichen Die Zuordnungsregeln variieren. Wenn Sie zu diesem Zeitpunkt das automatische Laden von Klassenbibliotheksdateien implementieren möchten, müssen Sie alle Zuordnungsregeln in der Funktion autoload() implementieren. Daher kann die Implementierung der Funktion autoload() sehr kompliziert oder sogar unmöglich sein. Am Ende kann die Funktion autoload() sehr aufgebläht werden. Selbst wenn sie implementiert werden kann, wird sie sich stark negativ auf die zukünftige Wartung und Systemeffizienz auswirken. In diesem Fall
<?php 

  function autoload($class_name) { 
       require_once ($class_name . “class.php”); 
  } 
   $memo= new Demo();  
wurde die SPL-Standardbibliothek in PHP5 eingeführt,

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 &#39;autload class:&#39;, $class_name, &#39;<br />&#39;;
}
function classLoader($class_name) {
    echo &#39;SPL load class:&#39;, $class_name, &#39;<br />&#39;;
}
spl_autoload_register(&#39;classLoader&#39;);
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(&#39;CalssLoader::loader&#39;);    
$test = new Test();

      一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用autoload()函数。如果要避免这种情况,需采用一种更加安全的spl_autoload_register()函数的初始化调用方法:

if(false === spl_autoload_functions()){    
    if(function_exists(&#39;autoload&#39;)){    
        spl_autoload_registe(&#39;autoload&#39;,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(&#39;className&#39;) && class_exists(&#39;className&#39;,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!

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