Função personalizada para carregamento automático de classes em OOP em PHP
Frequentemente, o carregamento automático padrão pode não atendê-lo por algum motivo. Nesse caso, você pode criar seu próprio carregamento automático.
Para isso, você precisa passar sua função de callback
escrita por você como primeiro parâmetro para a função spl_autoload_register.
Esta função será chamada quando o PHP detectar
um acesso a uma classe não carregada. O nome da classe
com o namespace será passado como parâmetro para esta função:
<?php
spl_autoload_register(function($class) {
// a variável $class conterá o nome da classe com o namespace
});
?>
E a responsabilidade da função é carregar essa classe
via require com base no nome da classe.
Ou seja, dentro desta função, devemos definir
nossa própria regra para carregar classes, ou seja,
nossa própria convenção de nomenclatura.
Vamos escrever um exemplo de um carregamento automático personalizado. Suponha, por exemplo, que estamos dizendo que o caminho para o arquivo da classe a partir da raiz do site será o mesmo que o namespace, mas preservando o caso dos caracteres.
Ou seja, se temos a classe Core\Admin\PageController,
o caminho para ela deve ser Core/Admin/PageController.php.
Como você pode ver, para transformar o nome da classe
com seu namespace, precisamos apenas trocar
as barras invertidas por barras normais, e adicionar
.php ao nome da classe. Vamos fazer isso:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
No entanto, obteremos um caminho relativo para o arquivo (em relação à raiz do site). É melhor fazer um caminho absoluto, assim:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Há mais uma nuance. Em diferentes sistemas operacionais,
o caminho pelas pastas pode ter barra normal
ou barra invertida. Vamos tornar nosso código independente
do sistema operacional. Para isso, em vez
da barra normal para separar os caminhos, usaremos
a constante DIRECTORY_SEPARATOR,
que contém a barra correta do sistema operacional
no qual nosso script está sendo executado. No final, obtemos o seguinte código:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Teste a função de carregamento automático que criei.
Invente sua própria regra de carregamento automático e implemente-a.