Como adiciono parcialmente o namespace do PHP a uma biblioteca sem quebrar o código existente?


10

Minha empresa criou uma estrutura modular PHP ao longo dos anos, começando muito antes do PHP 5.3 adicionar espaços de nomes. Recentemente, decidimos começar a usar espaços para nome no novo código da nossa biblioteca e pretendemos eventualmente colocar o código antigo no espaço para nome. No entanto, temos alguns problemas que estamos tentando resolver para determinar se a adição de namespaces a uma base de código anterior à v5.3 não é uma boa idéia:

  1. Posso namespace uma classe, mas também importar (usar) o namespace global para que todas as classes globais não precisem de um \prefixo?
  2. Se nomearmos uma classe existente em nossa biblioteca, como podemos impedir que todos os projetos existentes sejam interrompidos assim que a estrutura for atualizada? Por exemplo, a biblioteca pode alterar o nome da classe ThemeEnginepara \module\theme\ThemeEngine, mas os sites existentes chamam ThemeEnginesem nenhuma modificação de código? Se sim, como seria esse código?

Respostas:


2
  1. Você não pode 'usar' namespaces, infelizmente, apenas classes: http://www.php.net/manual/en/language.namespaces.importing.php . Editar: você pode importar classes do namespace global, como fizeram com o ArrayObject em um dos exemplos.

  2. Você pode ter uma seção global de instruções de uso para que todas as classes preexistentes, que também estão no espaço de nomes global, teoricamente encontrem as classes perfeitamente. Teoricamente ...

Estamos no mesmo barco que você, mais ou menos. Temos um código antigo que não usa espaços para nome, mas usa o _ namespace faker (como Zend_Db_Table ...) e temos um código mais antigo que nem mesmo falsifica espaços para nome. Provavelmente vamos seguir o mesmo caminho, mas ainda precisamos testar se é possível. Boa sorte!


1

Sim, o que fiz no final foi use - 'use' para importar as classes individuais de que eu precisava

por exemplo, em vez de adicionar '/' na frente de tudo, como:

\DateTime()

Eu adicionei no meu namespace

namespace MyProject;
use DateTime;

...
DateTime();     //without \
...
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.