Qual è il principio di caricamento a PHP?
-
21-09-2019 - |
Domanda
spl_autoload_register
può fare questo tipo di lavoro, ma non capisco come è quel tipo di lavoro fatto?
spl_autoload_register(array('Doctrine', 'autoload'));
Soluzione
L'idea di base è che non c'è bisogno di scrivere le istruzioni include
/ require
più:. Ogni volta che si sta tentando di utilizzare una classe non definita, PHP chiamerà il caricatore automatico
Il lavoro del caricatore automatico, quindi, è quello di determinare quale file da caricare, e include
, quindi la classe diventa definito.
PHP può quindi utilizzare tale classe, come se tu fossi quello che ha scritto le istruzioni include
, che è di fatto stato eseguito nella funzione di caricamento automatico.
Il "trucco" è che la funzione di caricamento automatico:
- riceve solo il nome della classe
- deve determinare quale file da caricare - vale a dire che file contiene la classe .
Questa è la ragione per la convenzione di denominazione, come il PEAR uno, che dice che la classe come Project_SubProject_Component_Name
vengono mappati a file come Project/SubProject/Component/Name.php
- vale a dire '_
' nei nomi di classe sono sostituisce da barre (directory , sottodirectory) sul filesystem.
Per esempio, se si dà un'occhiata al metodo di Doctrine_Core::autoload
, che è quello che verrà chiamato come un caricatore automatico nel tuo caso, contiene questa porzione di codice (dopo aver affrontato alcuni casi specifici) :
$class = self::getPath()
. DIRECTORY_SEPARATOR .
str_replace('_', DIRECTORY_SEPARATOR, $className)
. '.php';
if (file_exists($class)) {
require $class;
return true;
}
return false;
Il che significa il nome della classe del è mappato al file system, sostituendo '_
' da '/
', e l'aggiunta di un .php
finale al nome del file.
Per esempio, se si sta cercando di utilizzare la classe Doctrine_Query_Filter_Chain
, e non si sa da PHP, si chiamerà la funzione Doctrine_Core::autoload
; che sarà determinare che il file che deve essere caricato è Doctrine/Query/Filter/Chain.php
; e come tale file esiste, sarà inclusa -. che significa PHP ora "sa" la classe Doctrine_Query_Filter_Chain