Artigos: Namespaces e o PHP 5.3

Um termo que logo, logo fará parte da vida de nós desenvolvedores PHP será o conceito de namespace. Mas afinal o que vem a ser o termo namespace? Fazendo uma tradução livre do termo, este seria algo como “espaço nomeado”, apesar do termo parecer complexo, o seu uso tende a não ser, uma fez que a sua função é “facilitar” o desenvolvimento. Bem como a tradução livre nos trouxe, namespace é um espaço ou região, dentro de um programa, onde um nome (uma variável, função etc) é considerado válido. O conceito de namespace está presente em linguagens como C++, C# entre outras. Contudo cada linguagem tem as suas particularidades quanto da implementação desta funcionalidade, olhando o quadro abaixo extraído do Blog http://phpimpact.wordpress.com/ sob o título “PHP - Controvérsias sobre Namespace” (tradução) verificamos que isto é verdade:

Java:
Atributos/Acesso a métodos: foo.bar
Acesso a métodos estáticos: Foo.bar
Acesso a pacotes:           foo.bar.baz
C#:
Atributos/Acesso a métodos: foo.bar
Acesso a métodos estáticos: Foo.bar
Acesso a namespaces       : foo.bar.baz
Python:
Atributos/Acesso a métodos: foo.bar
Acesso a métodos estáticos: Foo.bar
Acesso modular            : foo.bar.baz
PHP:
Atributos/Acesso a métodos: $foo->bar
Acesso a métodos estáticos: Foo::bar
Acesso a namespaces:        C:\foo\bar\baz

A grande discussão em torno da introdução de namespaces no PHP, se refere ao uso da barra \ para notação desta característica. Muitos esperavam o uso dos dois pontos seguidos (::), como operador para aplicação desta característica, porém existia o problema disto caracterizar o uso (chamadas) de métodos estáticos de classe ou mesmo a constantes de classe. Assim após várias discussões, algumas acaloradas, a barra \ acabou sendo adotada como padrão de notação desta funcionalidade no PHP. Para saber mais sobre a discussão que levou a escolha deste operador, veja os links referentes a implementação desta RFC:

http://wiki.php.net/rfc/backslashnamespaces - Problemas de namespace e possíveis soluções
http://wiki.php.net/rfc/namespaceresolution - Indenticador de Namespaces
http://wiki.php.net/rfc/namespaceseparator - Separador para Namespaces

Bem o foco deste texto não é entrar no mérito deste ou daquele operador para uso do namesapces pela linguagem, mas sim dar alguns toques sobre o seu uso. Então vamos a outra pergunta por que usar namespaces? O emprego de namespace é útil, para evitarmos conflitos com nomes de classes, métodos e para o uso de classes com nomes gigantes ex: Minha_infinita_super_mega_nome_da_classe_que_eu_fiz_e_executa_algo, surgindo assim diversas facilidades na hora de usarmos pacotes e incluirmos bibliotecas.

Um exemplo:

minha_data.php

//Contéudo do arquivo
namespace Date\WeekDay;
class Retornando_a_mensagem_dia_da_semana {
    function dia() {
        echo 'Dia da semana';
    }
}

Usando o código acima:

<?php
    require 'Bibliotecas/Data/minha_data.php';
    use Date\WeekDay\Retornando_a_mensagem_dia_da_semana as Semana;
    $objeto = new Semana();
    $objeto->dia();
?>

Outro exemplo da aplicação de namespaces agora aplicado em classes e métodos que podem surgir com nome iguais:

arquivo util.php

<?php
    namespace util;
    function utilidade(){
        echo "é função\n";
    }
?>

arquivo util_teste.php

<?php
    include 'util.php';
    class util {
         static function utilidade() {
             echo "é método\n";
         }
    }
    // O que será impresso ?
    util\utilidade();

    // Será impresso "é função", pois estamos chamando
    //apartir do namespace
?>

E um exemplo bem interessante é usando duas vezes o namespace no mesmo arquivo.

arquivo double_space.php

<?php
    namespace util\util;
    function utilidade() {
        echo "é função \n";
    }

    namespace util;

    class util {
        static function utilidade(){
            echo "é método\n";
        }
    }

    // O que será impresso ?
    util\utilidade();

    //Será impresso o "é método", pois estamos chamando
    //a partir do namespace util\ caso se queira a função,
    //usaríamos util\util\utilidade()
?>

Bem polêmicas a parte, a introdução desta funcionalidade na linguagem tende a facilitar a vida dos desenvolvedores. Que assim, poderão usar bibliotecas com as do PEAR ou de seu framework preferido, sem preocupar se existirão conflitos de nomes classes salvo algumas exceções. Além do que não será mais necessário juntar o nome do pacote ao da classe. Contudo uma observação, olhando o manual do PHP em sua versão off-line datada de 20 de Fevereiro de 2009, ainda consta a questão dos (dois pontos) :: para uso de namespaces. E para finalizar aqueles que desejam conhecer e testar estas e outras novidades já está disponível no site do php.net a versão do PHP 5.3.0 beta 1, já que a versão 5.2.9 pode a ser a última antes deste tão esperado release. Segue em completo a este assunto alguns links nacionais que falam desta discussão da barra \ + namespace no PHP, e que também foram usados como referências neste texto:

http://www.rafaelcunha.com/2008/11/07/namespaces-no-php/
http://www.augustopascutti.com/dev/namespaces
http://www.augustopascutti.com/dev/namespaces-a-revolta-continua

Autor 

Alexandre Altair de Melo – Atua como um dos coordenadores do PHPSC.

Zend Certified Engineer PHP 5.

Um dos autores do livro PHP Profissional - Editora Novatec

AnexoTamanho
MANJAPHP_Namespaces_PHP_5_3.pdf115.84 KB