Zuvor haben wir das Prinzip des automatischen Ladens von Composer kennengelernt, das tatsächlich die automatische Ladefunktion von Klassen in PHP nutzt.
Das automatische Laden von Klassen in PHP basiert hauptsächlich auf den beiden Methoden __autoload() und spl_autoload_register().
Heute schauen wir uns kurz die Anwendung dieser beiden Methoden an.
__autoload()
Als magische Methode, die bald eliminiert wird, müssen wir sie nur verstehen. Wenn diese Methode in PHP7 verwendet wird, wird eine veraltete Warnung gemeldet und das System empfiehlt die Verwendung der Methode spl_autoload_register().
function __autoload($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; } $autoA = new AutoA(); var_dump($autoA);
Wenn wir die AutoA-Klasse instanziieren, verfügt die aktuelle Datei nicht über diese Klasse und sie enthält oder erfordert keine anderen Dateien. Zu diesem Zeitpunkt wird automatisch die magische Methode __autoload() eingegeben. In der Methode __autoload() müssen wir nur die Datei einschließen, in der sich diese Klasse befindet.
spl_autoload_register()
Diese Methode hat derzeit die Funktion des automatischen Ladens von Klassen durch die obige magische Methode ersetzt. Es handelt sich um eine Methode in der spl-Erweiterungsbibliothek, die jetzt standardmäßig in PHP integriert ist. Sie können sie direkt verwenden.
Der Vorteil von spl_autoload_register() gegenüber __autoload() besteht darin, dass es ein __autoload() registrieren und eine __autoload()-Warteschlange implementieren und verwalten kann. Ursprünglich konnte es in einer Datei nur eine __autoload()-Methode geben, aber jetzt haben Sie eine Warteschlange.
Auf diese Weise müssen Sie nicht den gesamten Ladecode in eine __autoload()-Methode schreiben, sondern können mehrere spl_autoload_register() verwenden, um jede Klasse separat zu laden.
spl_autoload_register(function($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; }); $autoA = new AutoA(); var_dump($autoA);
Referenz: Eingehende Untersuchung der Composer-Prinzipien (2)
Verwenden Sie include oder include_once
Beim automatischen Laden müssen wir nur include verwenden, und die Klasse wird nicht wiederholt geladen.
spl_autoload_register(function($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; echo $name, PHP_EOL; }); $autoA = new AutoA(); var_dump($autoA); $autoA = new AutoA(); var_dump($autoA); $autoA = new AutoA(); var_dump($autoA); $autoB = new AutoB(); var_dump($autoB);
Aus dem Code können wir ersehen, dass $name nur einmal ausgegeben wird, wenn die Klasse mehrmals instanziiert wird. Sie müssen sich also keine Gedanken über das Problem des wiederholten Ladens von Klassendateien machen. Darüber hinaus werden bei der Verwendung von Composer in einem großen Framework viele Klassen geladen, und die _once-Methode führt ebenfalls zu Effizienzproblemen.