SPL Autoloading melhores práticas
-
19-09-2019 - |
Pergunta
Na minha include_path no lado do servidor Eu tenho uma referência a um diretório de pêra, em '/ usr / share / pêra /'. Dentro de minhas aplicações eu incluir arquivos de uma biblioteca comum, vivendo em '/ usr / share / pêra / biblioteca /' com require_once 'library/file.php'
.
Eu recentemente começou a usar o autoloader SPL, notei na função de carregador você tem que determinar a lógica com a qual para incluir o arquivo. Minha primeira maneira de fazer isso estava tentando incluir um arquivo e suprimi-la com @
para ver se ele iria falhar, por exemplo, @include 'library/file.php'
no entanto, penso principalmente porque eu li muito sobre @
sendo uma prática ruim eu decidi fazer manualmente o trabalho sozinho pela explosão get_include_path
pela PATH_SEPARATOR
e ver se o diretório é o que eu quero que seja, em seguida, fazendo um file_exists
e incluí-lo .
Assim:
function classLoader( $class ) {
$paths = explode( PATH_SEPARATOR, get_include_path() );
$file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
if ( file_exists( $file) == false )
{
$exists = false;
foreach ( $paths as $path )
{
$tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
if ( file_exists ( $tmp ) )
{
$exists = true;
$file = $tmp;
}
}
if ( !$exists ) { return false; }
}
include $file;
}
spl_autoload_register('classLoader');
Será que eu ir a rota errada? Eu deveria ter acabado de fazer o negócio @include
ou estou fazendo-o um pouco na direção certa?
Solução
Uma coisa que a projeto Habari autoloader faz isso é interessante cache a lista de arquivos classe inteira na memória para que ele não está fazendo pesquisas de disco para os arquivos de cada vez que uma classe é solicitado.
Essencialmente, você declarar um estático dentro de sua __autoload()
que contém uma matriz de todos os arquivos de classe, indexados pela classe que irá levá-los a carregar. Por exemplo, o código seria usar Dir ou glob()
para gerar essa matriz estática:
$class_files = array(
'user' => '/var/www/htdocs/system/classes/user.class.php',
);
Em seguida, você simplesmente incluir $class_files[$class]
para obter o arquivo correto. Isso é bom e rápido, porque ele recebe o catálogo a partir do disco de uma só vez, em vez de gerar a lista ou à procura de um nome de arquivo específico cada vez que uma nova classe é referenciado. (Você ficaria surpreso quanto de uma diferença de velocidade que faz.)
Se o nome da classe não é uma chave na matriz, você pode lançar uma exceção personalizada ou gerar um esboço de classe / simulação para retorno. Além disso, se você verificar o autoloader sistema Habari, você verá que implementos habari __static()
em classes que são carregar automaticamente, que é como um construtor para classes estáticas.
include_once()
deve ser evitado, eo operador @
é desnecessário se você verificou para o arquivo a ser incluído.
Outras dicas
Eu, pessoalmente, ir pelo caminho usando
function autoload($class) {
/* transform class name into filename ... */
include $class;
}
mesmo sem o @ para facilitar o debug (erros são desligados / logado produção)
Você também pode estar interessado na discussão relacionada na lista desenvolvedor PHP: http: / /marc.info/?t=125787162200003&r=1&w=2