Pergunta

Que solução você recomendaria para incluir arquivos em um projeto PHP?

  1. Não há chamadas manuais de exigir / incluem funções - tudo cargas através de funções autoload
  2. Pacote de importação, quando necessário.

Aqui está o pacote de importação de API:

import('util.html.HTMLParser');
import('template.arras.*'); 

Nesta declaração função que pode explodir a corda com pontos (pacote hierarquia delimitador), looping através de arquivos em particular pacote (pasta) para incluir apenas um deles ou todos eles se o símbolo asterisco é encontrado no final da corda, por exemplo, ( 'Template.arras. *').

Um dos benefícios que eu posso ver no método pacote de importação, é que ele pode forçá-lo a usar melhor a decomposição objeto e classe de agrupamento.

Uma das desvantagens que posso ver no método autoload -. É que a função autoload pode se tornar muito grande e não muito óbvio / legível

O que você acha sobre isso?

  • Que benefícios / desvantagens podem você nomear em cada um desses métodos?
  • Como posso encontrar a melhor solução para o projeto?
  • Como posso saber se haverá quaisquer problemas de desempenho se o gerenciamento de pacotes é usada?
Foi útil?

Solução

Eu uso __autoload () extensivamente. A função autload que usamos em nossa aplicação tem alguns ajustes para compatibilidade com versões anteriores das classes mais velhos, mas nós geralmente seguem uma convenção ao criar novas classes que permitem que o autoload () para trabalhar bastante seemlessly:

  • Consistente classe Naming : cada classe em seu próprio arquivo, cada classe é nomeado com camelo caso separados por um sublinhado. Este mapeia para o caminho da classe. Por exemplo, Some_CoolClass mapeia para o nosso diretório de classe, em seguida, 'Some / CoolClass.class.php'. Eu acho que algumas estruturas utilizar esta convenção.
  • Explicitamente Exigir classes externas :. Uma vez que não tem controle sobre a nomeação de quaisquer bibliotecas externas que usamos, nós carregá-los utilizando a função do PHP require_once ()

Outras dicas

O método de importação é uma melhoria, mas ainda carrega-se mais do que o necessário.
Ou usando o asterisco ou carregá-los no início do script (porque importar antes de cada "nova Classname" vai tornar-se complicada)

Eu sou um fã de __autoload() ou ainda melhor spl_autoload_register()
Porque ele irá incluir apenas as classes que você está usando e o benefício extra de não se importar onde a classe está localizado. Se suas faculdades move um arquivo para outro diretório que não sejam efectuadas.

A desvantagem é que ele precisa de lógica adicional para que ele funcione corretamente com diretórios.

Eu uso require_once ( "../ path-to-auto-load-script.php.inc") com carregamento automático

Eu tenho uma convenção de nomenclatura padrão para todas as classes e arquivos inc que torna mais fácil para determinar programaticaly o nome da classe está sendo solicitado.

Por exemplo, todas as classes têm uma determinada extensão como inc.php
(assim que eu sei que eles vão estar no diretório / cls)
e
todos os arquivos inc começar com .ht (assim eles estarão no diretório / inc)

carregamento automático aceita um parâmetro: className, que, em seguida, usar para determinar onde o arquivo está realmente localizado. looping uma vez eu sei que o meu diretório de destino é, cada vez adicionando "../" para a conta para sub sub-páginas, (que parecia quebrar carregamento automático para mim) e, finalmente, require_once'ing o arquivo de código real uma vez encontrado.

Eu fortemente sugiro fazer o seguinte em vez disso:

Lance todas suas aulas em uma matriz estática, className => filepath / classfile. A função de carregamento automático pode usar isso para classes de carga.

Isso garante que você sempre carregam a quantidade mínima de arquivos. Isso também significa que você evite nomes de classe completamente tolas, e análise das referidas nomes.

Se ele é lento, você pode jogar em algum acelerador, e que você vai ganhar muito mais, se ele ainda é lenta, você pode executar as coisas através de um processo de 'compilação', onde os arquivos frequentemente utilizados são apenas despejado em comum arquivos, e as referências autoload pode ser atualizado para apontar para o local correto.

Se você começar a correr em questões onde o seu carregamento automático é muito lento, o que eu acho difícil de acreditar, você pode dividir que de acordo com pacotes, e têm múltiplas funções de carregamento automático, desta forma apenas subconjuntos de matriz são necessárias, isso funciona melhor se seus pacotes são definidos em torno de módulos de seu software (login, admin, e-mail, ...)

Eu não sou um fã de __autoload(). Em um monte de bibliotecas (algumas bibliotecas de pêra, por exemplo), developersuse class_exists() sem passar no espaço relativamente novo segundo parâmetro. Qualquer código legado você tem também pode ter este problema. Isto pode causar avisos e erros se você tiver um __autoload() definido.

Se as suas bibliotecas são claras, porém, e você não tem o código legado para lidar com, é uma ferramenta fantástica. Às vezes eu desejo PHP tinha sido um pouco mais inteligentes sobre como eles conseguiram o comportamento de class_exists(), porque eu acho que o problema é com essa funcionalidade em vez de __autoload().

Rolling seu próprio sistema de embalagem é provavelmente uma má idéia. Eu sugiro que você vá com o manual explícito inclui, ou com autoload (ou uma combinação para que o assunto).

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