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'));
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top