Avançar para a área de conteúdo

ir para o conteúdo principal

developerWorks Brasil  >  Software livre  >

Criar Espaços de Nomes Melhores em PHP

Dicas para criar espaços de nomes mais intuitivos

developerWorks
Opções de documento

Opções de documento que necessitam de JavaScript não são exibidas


Classificar esta página

Ajude-nos a melhorar este conteúdo


Nível: Intermediário

Nathan A. Good, Senior Information Engineer, Freelance Developer

23/Jun/2009

PHP V5.3 introduz capacidade de fornecer espaços de nomes para suas classes, constantes e funções PHP. Usar espaços de nomes permite que você evite conflitos de nomenclatura e forneça contexto para seu código PHP. Essa dica fornece algumas diretrizes para construir seus espaços de nomes de forma que você obtenha o máximo deles.

Espaços de nomes — introduzidos no PHP V5.3 — são uma maneira de fornecer contexto a suas classes, constantes e funções PHP de forma que os elementos com os mesmo nomes possam ser entendidos como exclusivos. Os nomes exclusivos permitem que você evite conflitos de nomenclatura, o que ocorre quando existem duas classes ou funções com o mesmo nome. Às vezes, essas classes PHP representam os mesmo objetos em seu domínio físico, mas o comportamento da classe é inteiramente diferente. Espaços de nomes são uma maneira de assegurar que você tenha a classe, constante ou função PHP correta e que as pessoas que estão usando suas classes PHP podem ter certeza de que estejam usando as corretas.

Espaços de nomes em código funcionam exatamente como contextos no mundo físico. Considere uma classe que represente o objeto de domínio do mundo real automóvel. Para uma empresa que vende automóveis através da Internet, a classe Automobile pode ter comportamentos inteiramente diferentes de uma classe Automobile de uma empresa que vende seguros de automóveis.

Como um desenvolvedor de aplicativos, é possível usar componentes gravados por outras pessoas. Você nunca pode ter certeza de que essas pessoas não optaram por usar nomes de classes que você possui, mas para uma classe inteiramente diferente. Antes dos espaços de nomes, era comum um desenvolvedor de PHP construir o contexto no nome da classe, como My_Enterprise_Person ou XML_Validator.

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


Lista 1. Declarando uma classe em um espaço de nome

<?php
namespace IBM;
class Foo {
...
}
?>

Um exemplo de fazer referência à classe em um espaço de nomes é mostrado abaixo.


Lista 2. Referindo-se a uma clase em um espaço de nome

<?php
$foo = new \IBM\Foo();
?>

Definir uma política de espaço de nomes é uma boa ideia antes de iniciar a inclusão de espaços de nomes para todas as suas classes. Apesar de ser aceitável até certo ponto aumentar seus espaços de nomes construindo os mesmos ao longo do tempo, é melhor optar por uma estrutura comum para seus espaços de nomes que facilite a organização dos mesmos e reduza a chance de muito retrabalho posteriormente. Quando usados corretamente, os espaços de nomes podem ser um método para organizar seu código PHP além de fornecer contexto.

Outras linguagens, como as linguagens Java™ e C#, têm espaços de nomes há muito tempo. Ao escolher como denominar meus espaços de nomes, uso convenções semelhantes a dessas linguagens, pois são familiares e entendidas por muitos desenvolvedores. No entanto, diferentemente da linguagem Java, os espaços de nomes em PHP não estão vinculados ao diretório no qual a classe reside. É possível fornecer a uma classe, função ou constante qualquer espaço de nomes que desejar. É possível usar até mesmo mais de um espaço de nomes por arquivo. E diferentemente de C#, é possível fornecer espaços de nomes a funções ou constantes que não estão dentro de classes.

Espaços de Nomes de Alto Nível

Se estiver construindo aplicativos para uma organização, use o nome de sua organização como um domínio de alto nível. Criar um espaço de nomes de alto nível com o nome de sua organização geralmente é suficiente para fornecer seu contexto de código PHP e evitar conflitos de nomenclatura, a menos que sua organização grave muitos aplicativos diferentes para diferentes propósitos ou para subdivisões.

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


Lista 3. Um espaço de nomes de alto nível

<?php
namespace IBM;
...
?>



Voltar para parte superior


Subespaços de Nomes

Subespaços de Nomes são espaços de nomes dentro de espaços de nomes de alto nível. Eles fornecem maior esclarecimento se o espaço de nomes de alto nível não for suficiente para estabelecer contexto para a classe PHP que você está criando.

Ao criar subespaços de nomes, é importante não perder o controle e criar muitos. Eles se tornam difíceis de organizar e referir se forem muito numerosos. Isso é especialmente importante quando estiver usando espaços de nomes para o propósito de organizar seu código PHP, assim como evitar conflitos de nomenclatura.

Ao decidir quantos subespaços de nomes introduzir em outro espaço de nomes para propósitos organizacionais, tento manter o número limitado a sete (mais ou menos dois) para tirar proveito da ideia que, conceitualmente, blocos de sete itens são mais fáceis de lembrar. Isso nem sempre funciona, mas uso como uma diretriz para determinar se estou dividindo espaços de nomes em muitos subespaços de nomes.

A Lista 4 mostra um exemplo de declaração de um subespaço de nomes dentro de um espaço de nomes de alto nível.


Lista 4. Um 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 por um caractere de barra invertida (\).

Quando estiver declarando subespaços de nomes, é possível usar duas técnicas comuns diferentes ou uma combinação das mesmas. Um local comum para obter nomes para subespaços a partir de nomes é a partir de nomes de projetos ou de aplicativos; o outro é a partir do nome de domínio.

Definindo por Projeto

Caso tenha usado o nome de sua organização como o espaço de nomes de alto nível e ainda busque subespaços de nomes para fornecer ainda mais contexto, é possível usar nomes de projetos ou de aplicativos como o nome de uma subespaço de nomes. Por exemplo, se estiver construindo um novo aplicativo chamado Greeter que solicita nomes de usuários e os cumprimenta, use um espaço de nomes como o da Lista 5 para fornecer contexto integral para uma classe chamada Prompt.


Lista 5. Usando o nome do aplicativo como um subespaço de nomes

<?php
namespace IBM\Greeter;
class Prompt {
...
}
?>

Como Prompt poderia ser o nome de uma classe em diversos aplicativos ou bibliotecas diferentes, fornecer a esse espaço de nomes o nome da organização e o nome do projeto diferencia este Prompt dos outros.

Definindo por Domínio

Usar o nome de um domínio é outro esquema comum para escolher nomes de subespaços de nomes, como a Lista 6 mostra. Pode ser usado além do nome do projeto ou não, dependendo de seus planos para capacidade de reutilização (consulte Denominando para Capacidade de Reutilização).

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


Lista 6. Usando o domínio como um subespaço de nomes

<?php
namespace IBM\MyApp\Account;
class Address {
...
}
?>



Voltar para parte superior


Denominando para Capacidade de Reutilização

Além de aplicar conceitos de modularidade que possibilitam a reutilização, a maneira de denominar classes e espaços de nomes fornece a eles um propósito implícito e, portanto, capacidade de reutilização. Às vezes, opções de nomenclatura pobres impedem a reutilização, pois os nomes pobres sugerem que uma classe esteja limitada a uma propósito específico. De forma semelhante, espaços de nomes quando aplicados incorretamente podem "especializar" classes de forma desnecessária e torná-las estranhas para reutilização em outro local.

Pode ser importante em um espaço de nomes de alto nível que contenha o nome de uma organização reverter um espaço de nomes "Comum", "Principal", "Biblioteca" ou outro que possa ser usado para armazenar classes que possam ser reutilizadas em vários aplicativos. Exemplos comuns são validação, onde as regras para uma unidade de manutenção de estoque (SKU), número de conta ou número de fatura para toda a empresa são as mesmas para formato e comprimento apropriados. Para esse tipo de classe de validação, um bom espaço de nomes pode ser algo como a Lista 7.


Lista 7. Usando um espaço de nomes de validação comum

<?php
namespace MyCompany\Common\Validation;
class NotNullValidator {
...
}
?>

Aqui, o nome da organização é usado como o domínio de alto nível ("MyCompany"). O espaço de nomes "Common" é usado como o projeto. Apesar de essa classe ter sido gravada, possivelmente, enquanto um aplicativo específico era gravado, a classe pode ser usada por qualquer projeto da organização. Por fim, "Validation" é usado como o domínio para a classe.



Voltar para parte superior


Usando Aliases

Apesar de espaços de nomes ajudarem a organizar classes e evitar convenções de nomenclatura, eles têm a desvantagem de nomes mais longos. Felizmente, PHP fornece a capacidade de usar um alias para que seja possível fazer referência ao nome do alias mais curto em seu código. A Lista 8 fornece um exemplo.


Lista 8. Usando um alias

<?php
use MyCompany\Common\Validation as Validators;
?>



Voltar para parte superior


Convenções de Nomenclatura

É consistente com outras convenções PHP — como a nomenclatura de pacote e nomes de arquivos de PHP Extension and Application Repository (PEAR) — para usar convenções de nomenclatura de maiúscula de camel ou PASCAL com nomes de espaços de nomes. Por exemplo, prefira o espaço de nomes da Lista 9 àquele da Lista 10.


Lista 9. Nomenclatura de maíuscula camel ou PASCAL

<?php
namespace MyNamespace;
?>

Evite o uso de convenções de nomenclatura e de maiúsculas e minúsculas que sejam contrárias às demais convenções PHP.


Lista 10. Usando uma conveção pobre de letras maiúsculas e minúsculas

<?php
namespace mynamespace;
...
?>



Voltar para parte superior


Conclusão

Espaços de nomes em PHP são uma maneira de organizar seu código, evitar conflitos de nomenclatura e fornecer contexto para suas classes, funções e constantes. Usar um esquema ou convenção para seus espaços de nomes possibilita que seu código seja facilmente entendido, assim como facilmente referido e usado.



Recursos

Aprender

Obter produtos e tecnologias

Discutir


Sobre o autor

Nathan Good

Nathan 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.




Avalie esta página


Reserve um instante para completar este formulário para nos ajudar a servi-lo melhor.



 


 


Não
são úteis
Extremamente
úteis
 






Voltar para parte superior