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?

Foi útil?

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

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