Pergunta

spl_autoload_register Pode fazer esse tipo de trabalho, mas não entendo como esse tipo de trabalho é feito?

spl_autoload_register(array('Doctrine', 'autoload'));
Foi útil?

Solução

A ideia básica é que você não precisa escrever include/require Instruções mais: Sempre que você está tentando usar uma classe não definida, o PHP chama o Autoloader.

O trabalho do Autoloader, então, é determinar qual arquivo deve ser carregado e include Isso, para que a classe seja definida.

PHP pode então usar essa classe, como se você fosse quem escreveu o include Instrução, que de fato foi executada na função de carregamento automático.


O "truque" é que a função de carregamento automático:

  • Recebe apenas o nome da classe
  • precisa determinar qual arquivo carregar - ou seja, qual arquivo contém essa classe.

Esta é a razão para a convenção de nomeação, como a pêra, que diz que classe como Project_SubProject_Component_Name são mapeados para arquivos como Project/SubProject/Component/Name.php - ou seja,_'Nos nomes de classe são substituídos por barras (diretórios, subdiretórios) no sistema de arquivos.


Por exemplo, se você dar uma olhada no Doctrine_Core::autoload Método, que é o que será chamado de automóvel no seu caso, ele contém essa parte do código (depois de lidar com alguns casos específicos) :

$class = self::getPath() 
            . DIRECTORY_SEPARATOR . 
            str_replace('_', DIRECTORY_SEPARATOR, $className) 
            . '.php';
if (file_exists($class)) {
    require $class;
    return true;
}
return false;

O que significa que o nome da classe é mapeado para o sistema de arquivos, substituindo '_' por '/', e adicionando um final .php para o nome do arquivo.

Por exemplo, se você está tentando usar o Doctrine_Query_Filter_Chain classe, e não é conhecido pelo PHP, o Doctrine_Core::autoload A função será chamada; determinará que o arquivo que deve ser carregado é Doctrine/Query/Filter/Chain.php ; E como esse arquivo existe, será incluído - o que significa PHP agora "sabe" o Doctrine_Query_Filter_Chain classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top