Namespaces no PHP

Novembro 7, 2008 on 1:13 pm | In Informatica, php, Tutorial |

Todo mundo vem falando da grande discução do namespace no PHP, ja que vai ser uma característica nova e nem tudo mundo está acontento do uso ou de como vai ser usado, por isso desta discução enorme, porém ainda existe muitas pessoas que nem sabe o que é namespace, por isso vou escrever para tirar as dúvidas e para exemplificar seu funcionamento.

O Porque

O uso de namespace é bom para evitarmos conflitos com nomes de classes, métodos e para o uso de classes com nomes gigantes ex: Super_ultra_mega_nome_da_classe_que_faz_algo, surgindo diversas facilidades na hora de usarmos pacotes e incluirmos bibliotecas.

Antes de tudo

Métodos estáticos, no caso quando se usa métodos estáticos não há a necessidade de se instanciar a classe, segue exemplo abaixo

CODE:
  1. class foo {
  2.     public static function bar() {
  3.         return true;
  4.     }
  5. }
  6.  
  7. // chamando o método estático
  8. $resultado  = foo::bar();

A discução

A grande discução disto tudo foi qual seria o separador do namespace, em muitas linguagens usa-se o "::" também (alias, mesmo separador que o estático), porem com a chamada em maiúscula Foo::bar(), neste caso ele pode ser confundido com um separador para chamadas de métodos estáticos, o que criaria uma confusão, neste caso então rolou uma discução em qual outro separador deveria ser usado, em principio discutiu-se muito o separador ":::" com o separador "\", no caso foi escolhido o \ por diversos motivos, que pode-se ser visto aqui.
Saiba mais sobre a discução aqui e aqui no blog do Augusto Pascutti.

Exemplos

Neste primeiro exemplo vamos lidar com nomes de classes gigantes para vermos como fica com a declaração do namespace:

mysql_base.php

CODE:
  1. // The class file
  2. namespace Mysql\DB;
  3.  
  4. class Connection_com_mysql_utilizando_foo_printando_bar {
  5.    function foo() {
  6.        echo 'bar';
  7.    }
  8. }

CODE:
  1. require 'Lib/DB/mysql_base.php';
  2.  
  3. use Mysql\DB\Connection_com_mysql_utilizando_foo_printando_bar as DbConnection;
  4.  
  5. $z = new DbConnection();
  6. $z->foo();

Lidando com nomes de classes e metodos que possam surgir com nomes iguais

arquivo1.php

CODE:
  1. namespace foo;
  2. function bar(){
  3.   echo "funcao\n";
  4. }

CODE:
  1. include 'file1.php';
  2.  
  3. class foo {
  4.     static function bar(){echo "method\n";}
  5. }
  6.  
  7. foo\bar(); // O que será impresso ?
  8. // Será impresso o "funcao", pois estamos chamando apartir do namespace

Vamos a outro exemplo simples de como podemos lidar nomes de funções/métodos iguais diante do sistema

CODE:
  1. namespace foo\foo;
  2.  
  3. function bar(){echo "func\n";}
  4.  
  5. namespace foo;
  6.  
  7. class foo {
  8.     static function bar(){echo "method\n";}
  9. }
  10.  
  11. foo\bar(); // O que sera impresso ?
  12. // Será impresso o "method", pois estamos chamando apartir do namespace foo\ caso se quisermos a função, usamos foo\foo\bar


4 Comments »

RSS feed for comments on this post. TrackBack URI

  1. Cara, sem relação com o post. Eu queria saber se esse ícones das rede sociais foi você quem fez ou se tem algum direito autoral em cima deles.

    Comment by [barba] — Novembro 11, 2008 #

  2. Na verdade não tenho direitos autorais, não fui em que os fez e não me recordo da onde eles vieram.. ;/

    Abraços

    Comment by silici0 — Novembro 11, 2008 #

  3. Achei eles no seguinte endereço:

    http://www.iconspedia.com/icon/myspace-270-.html

    Abraços

    Comment by silici0 — Novembro 11, 2008 #

  4. Ah, valeu pelo link.

    Comment by [barba] — Novembro 11, 2008 #

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


 

 Assine o feed