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'));
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top