Criar melhores espaços de nomes em PHP

Dicas para criar espaços de nomes mais intuitivos

O PHP V5.3 apresenta a capacidade de fornecer espaços de nomes para classes, constantes e funções PHP. A utilização de espaços de nomes permite evitar colisões de nomenclatura e fornecer contexto ao código PHP. Estas dicas fornecem algumas diretrizes para construir os espaços de nomes para tirar o máximo proveito deles.

Nathan A. Good, Senior Information Engineer, Freelance Developer

Nathan GoodNathan A. Good lives in the Twin Cities area of Minnesota. Professionally, he does software development, software architecture, and systems administration. When he's not writing software, he enjoys building PCs and servers, reading about and working with new technologies, and trying to get his friends to make the move to open source software. He's written and co-written many books and articles, including Professional Red Hat Enterprise Linux 3, Regular Expression Recipes: A Problem-Solution Approach, and Foundations of PEAR: Rapid PHP Development.



23/Jun/2009

Os espaços de nomes — introduzidos no PHP V5.3 — são uma forma de oferecer contexto às classes, constantes e funções PHP para que os elementos com os mesmos nomes sejam compreendidos como únicos. Os nomes únicos permitem evitar colisões de nomenclatura, que ocorrem quando existem duas classes ou funções com o mesmo nome. Às vezes, essas classes PHP representam os mesmos objetos do domínio físico, mas o comportamento da classe é totalmente diferente. Os nomes de espaços são uma forma de certificar-se de que se tem a classe, constante ou função PHP correta e de que as pessoas utilizando as classes PHP podem ter certeza de que estão utilizando as corretas.

Os nomes de espaços em código funcionam exatamente como contextos no mundo físico. Considere uma classe que representa o automóvel objeto de domínio no mundo real. Para uma empresa que vende automóveis pela Internet, a classe Automobile pode ter comportamentos totalmente diferentes dos de uma classe Automobile de uma empresa que vende seguros.

O desenvolvedor de aplicativo pode usar componentes escritos por outras pessoas. O desenvolvedor pode nunca ter certeza de que as pessoas não decidiram utilizar os mesmos nomes de classe que ele, mas para uma toda uma classe diferente. Antes dos espaços de nomes, era comum um desenvolvedor PHP construir o contexto dentro do nome da classe, como My_Enterprise_Person ou XML_Validator.

A listagem 1 mostra um exemplo de uma classe que reside em um espaço de nomes.

Listagem 1. Declarando uma classe em um espaço de nomes
<?php
namespace IBM;
class Foo {
...
}
?>

Um exemplo de referência a uma classe em um espaço de nomes é demonstrado abaixo.

Listagem 2. Referindo-se a uma classe em um espaço de nomes
<?php
$foo = new \IBM\Foo();
?>

Definir uma política de espaço de nomes é uma boa ideia antes de começar a adicionar espaços de nomes a todas as classes. Embora seja aceitável até determinado limite ampliar os espaços de nomes construindo-os ao longo do tempo, é melhor decidir uma estrutura comum para os espaços de nomes que facilite organizá-los e reduzir a chance de muito retrabalho depois. Quando corretamente utilizados, os espaços de nomes podem ser um método de organizar o código PHP além de fornecer contexto.

Outras linguagens, como Java™ e C#, tiveram espaços de nomes por um longo tempo. Ao escolher como nomear meus espaços de nomes, eu uso convenções semelhantes àquelas linguagens porque são familiares e compreendidas por muitos desenvolvedores. Entretanto, diferente da linguagem Java, os espaços de nomes em PHP não são conectados ao diretório no qual reside a classe. É possível escolher qualquer espaço de nomes para uma classe, função ou constante. É possível usar mais de um espaço de nomes por arquivo. E diferente de C#, é possível atribuir espaços de nomes a funções ou constantes que não estejam dentro das classes.

Espaços de nomes de alto nível

Ao construir aplicativos para uma organização, pode-se utilizar o nome da organização como domínio de alto nível. Criar um espaço de nomes de alto nível com o nome da organização normalmente é suficiente para oferecer contexto ao código PHP e para evitar colisões de nomenclatura, a menos que a organização escreva muitos aplicativos para propósitos diferentes ou para subdivisões.

A listagem 3 contém um exemplo de declaração de espaço de nomes de alto nível.

Listagem 3. Espaço de nome de alto nível
<?php
namespace IBM;
...
?>

Subespaço de nomes

Subespaços de nomes são espaços de nomes dentro de espaços de nomes de alto nível Eles oferecem explicação adicional se o espaço de nome de alto nível não for suficiente para estabelecer o contexto para a classe PHP sendo criada.

Ao criar subespaços de nomes, é importante não se tornar superzeloso e criar muitos. Eles podem ficar difíceis de organizar e consultar mais tarde se forem muito numerosos. Isso é particularmente importante ao utilizar espaços de nomes para fins de organização do código PHP, bem como para evitar colisões de nomenclatura.

Ao decidir quantos subespaços de nomes introduzir em outro espaço de nomes para fins organizacionais, eu tento manter o número limitado a sete (mais ou menos dois) para ter vantagem da ideia de que, conceitualmente, lotes de sete itens são mais fáceis de lembrar. Isso nem sempre funciona, mas eu uso como diretriz para determinar se estou enchendo os espaços de nomes com muitos subespaços de nomes..

A listagem 4 contém um exemplo de declaração de subespaço de nomes dentro de um espaço de nomes de alto nível.

Listagem 4. Subespaço de nomes
<?php
namespace IBM\DeveloperWorks;
...
?>

O subespaço de nomes ("DeveloperWorks") é separado do espaço de nomes de alto nível ("IBM") que o contém com o caractere barra invertida (\).

Ao declarar subespaços de nomes, é possível utilizar algumas técnicas comuns ou uma combinação delas. Um lugar comum para conseguir nomes para subespaços de nome é a partir dos nomes de projeto ou aplicativo; além do nome do domínio.

Definindo por projeto

Se o nome da organização foi utilizado como espaço de nome de alto nível e ainda são necessários subespaços de nomes para fornecer contexto, é possível utilizar nomes de projeto ou aplicativo como nome do subespaço de nomes. Por exemplo, se estiver construindo um novo aplicativo chamado Greeter que pergunte os nomes dos usuários e os cumprimenta, uma boa prática é utilizar um espaço de nomes como o da Listagem 5, para fornecer contexto completo a uma classe chamada Prompt.

Listagem 5. Utilizando o nome do aplicativo como subespaço de nome
<?php
namespace IBM\Greeter;
class Prompt {
...
}
?>
-->

Como Prompt pode ser o nome de uma classe em vários aplicativos ou bibliotecas, fornecer este espaço de nome com o nome da organização e nome do projeto separa este Prompt dos outros.

Definindo por domínio

Utilizar o nome de um domínio é outro esquema comum para escolher os nomes do subespaço de nomes, como demonstrado na Listagem 6. Pode ser usado ou não em adição ao nome do projeto, dependendo dos planos de reutilização (ver "Nomenclatura para reutilização").

Um domínio é um grupo ou classificação de coisas encontradas no domínio de problema maior. Um exemplo de domínio pode ser "Conta", "Clientes" ou "Produtos" em um aplicativo maior que trate contas, clientes e produtos.

Listagem 6. Utilizando o domínio como subespaço de nome
<?php
namespace IBM\MyApp\Account;
class Address {
...
}
?>

Nomenclatura para reutilização

Além de aplicar conceitos de modularidade que permitem a reutilização, a forma de nomear classes e espaços de nomes também fornecem uma finalidade subentendida e, portanto, reutilização. Às vezes, escolhas impensadas de nomenclatura impedem a reutilização porque tais nomes implicam uma classe limitada a um propósito específico. Da mesma forma, quando aplicados incorretamente, os espaços de nome podem "especificar" classes desnecessariamente e torná-las inadequadas para reutilização em qualquer outro lugar.

Pode ser importante em um espaço de nomes de alto nível, que leva o nome de uma organização reservar um espaço de nomes "Common", "Core", "Lib" ou outro que possa ser utilizado para armazenar classes que possam ser reutilizadas entre aplicativos. Exemplos comuns são validação, onde as regras para uma unidade de manutenção de estoque (SKU), número de conta ou de fatura corporativa são as mesmas para formato e comprimento adequados. Para tal classe validadora, um bom espaço de nomes pode ser algo como apresentado na Listagem 7.

Listagem 7. Utilizando um espaço de nomes de validação comum
<?php
namespace MyCompany\Common\Validation;
class NotNullValidator {
...
}
?>

Aqui, o nome da empresa é utilizado como domínio de alto nível ("MyCompany"). O espaço de nomes "Common" é utilizado como projeto. Embora esta classe tenha sido escrita talvez enquanto um aplicativo específico era escrito, a classe pode ser utilizada por qualquer projeto na organização. Finalmente, "Validation" é utilizado como domínio para a classe.


Utilizando aliases

Embora os espaços de nomes ajudem a organizar classes e a evitar convenções de nomenclatura, eles têm o lado negativo de nomes mais longos. Felizmente, PHP oferece a capacidade de utilizar um alias para que seja possível consultar o nome alias mais curto no código. A listagem 8 oferece um exemplo.

Listagem 8. Utilizando um alias
<?php
use MyCompany\Common\Validation as Validators;
?>

Convenções de nomenclatura

É consistente com outras convenções PHP — como a nomenclatura do pacote PHP Extension and Application Repository (PEAR) e nomes de arquivo — utilizar convenções de nomenclatura em Maiúsculas no estilo "camelo" ou nomenclatura PASCAL com os nomes de espaço de nomes. Por exemplo, preferir o espaço de nomes da Listagem 9 ao invés do fornecido na Listagem 10.

Listagem 9. Nomenclatura em Maiúsculas no estilo "camelo" ou nomenclatura PASCAL
<?php
namespace MyNamespace;
?>

Evitar usar convenções de nomenclatura e letras contrárias ao restante das convenções PHP.

Listagem 10. Utilizando uma convenção pobre para letra
<?php
namespace mynamespace;
...
?>

Conclusão

Os espaços de nomes em PHP são uma forma de organizar o código, evitar colisões de nomenclatura e de oferecer contexto às classes, funções e constantes. Utilizar um esquema ou convenção para os espaços de nomes permite que o código seja facilmente compreendido, bem como facilmente consultado e utilizado.

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=406775
ArticleTitle=Criar melhores espaços de nomes em PHP
publish-date=06232009