Was ist das Prinzip der selbstladende in PHP?
-
21-09-2019 - |
Frage
spl_autoload_register
kann diese Art von Arbeit tun, aber ich verstehe nicht, wie ist diese Art von Arbeit getan?
spl_autoload_register(array('Doctrine', 'autoload'));
Lösung
Die Grundidee ist, dass Sie nicht über zu schreiben include
/ require
Anweisungen mehr:., Wenn Sie versuchen, eine nicht definierte Klasse zu verwenden, wird PHP den Autoloader aufrufen
Der Job des Autoloaders, dann ist zu bestimmen, welche Datei geladen werden soll, und include
es, so die Klasse definiert wird.
PHP kann dann diese Klasse verwenden, als ob Sie waren es, die die include
Anweisung geschrieben, die in der Tat wurden in der autoloading Funktion ausgeführt hat.
Der „Trick“ ist, dass die automatische Laden-Funktion:
- erhält nur den Namen der Klasse
- muss die Datei zu laden bestimmen - d. H welcher Datei diese Klasse enthält
Dies ist der Grund für die Namenskonvention, wie die PEAR ein, die diese Klasse wie Project_SubProject_Component_Name
sagt werden, um Dateien abgebildet wie Project/SubProject/Component/Name.php
- dh ‚_
‘ in den Klassennamen werden ersetzt durch Schrägstriche (Verzeichnisse , Unterverzeichnisse) auf dem Dateisystem.
Zum Beispiel, wenn Sie einen Blick auf der Doctrine_Core::autoload
Methode nehmen, der derjenige ist, der als Autoloader in Ihrem Fall aufgerufen wird, enthält sie diesen Teil des Codes (nachdem sie mit einigen speziellen Fällen zu tun) :
$class = self::getPath()
. DIRECTORY_SEPARATOR .
str_replace('_', DIRECTORY_SEPARATOR, $className)
. '.php';
if (file_exists($class)) {
require $class;
return true;
}
return false;
Was bedeutet, dass der Klassenname des auf das Dateisystem abgebildet wird, ersetzt ‚_
‘ durch ‚/
‘, und das Hinzufügen einer endgültige .php
des Dateinamen.
Zum Beispiel, wenn Sie versuchen, die Doctrine_Query_Filter_Chain
Klasse zu verwenden, und es ist nicht bekannt, wird von PHP, die Doctrine_Core::autoload
Funktion aufgerufen werden; es wird feststellen, dass die Datei, die geladen werden soll Doctrine/Query/Filter/Chain.php
ist; und wie die Datei vorhanden ist, wird es aufgenommen werden -. was bedeutet, PHP jetzt „weiß“ die Doctrine_Query_Filter_Chain
Klasse