spl_autoload_register()
permite registrar várias funções (ou métodos estáticos de sua própria classe Autoload) que o PHP colocará em uma pilha / fila e chamará sequencialmente quando uma "nova classe" for declarada.
Então, por exemplo:
spl_autoload_register('myAutoloader');
function myAutoloader($className)
{
$path = '/path/to/class/';
include $path.$className.'.php';
}
//-------------------------------------
$myClass = new MyClass();
No exemplo acima, "MyClass" é o nome da classe que você está tentando instanciar, o PHP passa esse nome como uma string para spl_autoload_register()
, o que permite pegar a variável e usá-la para "incluir" a classe / arquivo apropriado . Como resultado, você não precisa especificamente incluir essa classe por meio de uma instrução include / require ...
Simplesmente chame a classe que você deseja instanciar, como no exemplo acima, e como você registrou uma função (via spl_autoload_register()
) própria que descobrirá onde toda a sua classe está localizada, o PHP usará essa função.
A vantagem de usar spl_autoload_register()
é que, diferentemente de __autoload()
você não precisar implementar uma função de carregamento automático em todos os arquivos que você cria. spl_autoload_register()
também permite registrar várias funções de carregamento automático para acelerar o carregamento automático e torná-lo ainda mais fácil.
Exemplo:
spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');
class MyAutoloader
{
public static function ClassLoader($className)
{
//your loading logic here
}
public static function LibraryLoader($className)
{
//your loading logic here
}
Com relação a spl_autoload , o manual declara:
Esta função deve ser usada como uma implementação padrão para __autoload()
. Se nada mais for especificado e spl_autoload_register()
for chamado sem nenhum parâmetro, essas funções serão usadas para qualquer chamada posterior a __autoload()
.
Em termos mais práticos, se todos os seus arquivos estiverem localizados em um único diretório e seu aplicativo usar não apenas arquivos .php, mas arquivos de configuração personalizados com extensões .inc, por exemplo, uma estratégia que você poderia usar seria adicionar seu diretório contendo todos os arquivos para o caminho de inclusão do PHP (via set_include_path()
).
E como você também requer seus arquivos de configuração, você usaria spl_autoload_extensions()
para listar as extensões que deseja que o PHP procure.
Exemplo:
set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();
Como spl_autoload é a implementação padrão do __autoload()
método mágico, o PHP chamará spl_autoload quando você tentar instanciar uma nova classe.
Espero que isto ajude...
spl_autoload_register()
(e__autoload()
em geral) que ele carrega preguiçosamente inclui arquivos / classes? Isso está implícito na resposta, mas não é explicitamente declarado. Para mim, essa é uma informação crítica que seria perfeita para inclusão na sua resposta! :)Desde o PHP 5.3, você pode usar
spl_autoload_register()
com espaços para nome, o que significa que você pode organizar seu projeto e carregar automaticamente suas classes php sem nenhuma necessidade ou inclusão e sem redefinir uma__autoload()
função.Para demonstrar esse comportamento, basta criar um arquivo chamado index.php:
Em seguida, crie uma pasta chamada Main localizada ao lado do arquivo index.php. Por fim, cria um arquivo chamado Application.php localizado em Main e cole o seguinte código nele:
fonte
spl_autoload_register()
A implementação padrão não pode encontrar classes herdadas. Portanto, usando padrões, arquivos em minúsculas e diretórios que refletem o caminho do espaço para nome, tudo funciona bem, a menos que eu tenha uma classe que estenda outra classe (pai). O PHP então gera um erro que não consegue encontrar a classe pai, mesmo que todos estejam no mesmo diretório / espaço para nome! O que é confuso é que literalmente apenas as classes de primeiro nível são encontradas, então eu tive que colocar outraspl_autoload_register()
regra de função anônima logo após a 1ª ordem para incluir manualmente classes pai / herança herdadas.Aqui está a maneira como eu uso o Autoload. No exemplo dado, pretendo carregar classes de três diretórios diferentes.
No exemplo dado, o PHP procurará o namespace \ class nesses três diretórios usando esses três formatos diferentes de nome de arquivo.
fonte