Qual é o princípio da carga automática no PHP?
-
21-09-2019 - |
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'));
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.