Namespaces já existem em outras liguagens de programação há muito tempo, essa é uma das mudanças mais significativas no PHP 5.3. Desenvolvedores Java e C#, além de outras linguagens, já estão familiarizados com isso, e agora com a utilização de Namapaces a estrutura de aplicações PHP mudará para melhor. Então, o que é um namespace no PHP? Em suma, é um recipiente abstrato que nos permite reutilizar a mesma função, classe e nomes de constantes, mas se aplicam diferentes significados com base em que contexto eles estão inseridos.

Não dá pra tornar a explicação mais fácil?

Imagine um namespace como uma gaveta na qual você pode colocar todos os tipos de coisas: um caderno, uma caneta, um lápis, uma borracha… Estes são os seus pertences. Diretamente debaixo de sua gaveta é de outra pessoa, e ele coloca as mesmas coisas nele. Para evitar o uso de itens de cada um, você decide colocar uma etiqueta nas gavetas para deixar claro o que pertence a quem.
Anteriormente, os desenvolvedores tiveram que usar underscore em suas classes, funções e constantes para separar bases de código. Isso é equivalente à nossa etiqueta.
Essencialmente, um namespace não é nada mais do que um bloco de código hierarquicamente rotulado que contém código PHP normal.

Por que precisamos de Namespaces?

Conforme a sua biblioteca de código vai crescendo, há um aumento do risco de acidentalmente, você acabar redefinindo uma função ou nome de classe que já foi utilizada anteriormente. O problema é agravado quando você tenta adicionar componentes ou plugins de terceiros, por exemplo: o que aconteceria se dois ou mais componentes utilizassem a classe Usuário?
Até agora, a única solução foi alongar os nomes de classe/função de comprimento. Por exemplo, o wordpress utiliza o prefixo ‘wp_'(underscore).
Problemas de colisão de nomes pode ser resolvido com namespaces. Constantes, classes e funções podem ser agrupadas em namespaces diferentes.

Como namespaces são definidos?

Por padrão, todoas as constante, classes e nomes de função são colocados no espaço global – como eram antes do PHP suportar namespace.
O namespace é definido apenas pela palavra-chave namespaceno topo do seu arquivo PHP. Ele deve ser o primeiro comando (com a exceção do declare) e nenhum código não-PHP, HTML, ou de espaço em branco pode preceder essa palavra-chave.

Vamos dar uma olhada em um pequeno trecho de código, e então vamos quebrar e expandir o que está acontecendo em pequenas partes, para que fique mais fácil de entender.

namespace Foo;

function Bar()  
{
    echo __NAMESPACE__;
}

namespace FooFoo;

function Bar()  
{
    echo "Bar";
}

echo \Foo\Bar();  

Saída:

Foo

Existem alguns pontos interessantes aqui:
A palavra-chave namespace
A constante NAMESPACE
A redefinição da função Bar()
A estranha nova sintaxe no comando echo no final do arquivo: a resolução de nomes

A palavra-chave namespace

Namespaces são nomeados arbitrariamente e têm duas formas de sintaxe. Em tempo, em qualquer uma das sintaxes, namespaces não podem ser aninhados, embora, sub-namespaces possam ser definidos, como será explicado mais adiante.

Sintaxe 1

namespace Foo;

// bloco de código

Sintaxe 2

namespace Foo  
{
    // bloco de código
}

A utilização de Namespaces torna mais fácil evitar definições conflitantes e introduzir mais flexibilidade e organização dos seus códigos.
Perceba também que que as chaves em torno do bloco de código são completamente opcionais. Na verdade, aderindo à regra de utilizar um namespace por arquivo e omitindo as chaves você torna seu código muito mais limpo.

A constante __NAMESPACE__

A constante NAMESPACE contém uma seqüência que exibe o namespace atual. Quando chamado a partir do contexto global, uma string vazia é exibida.

<?php  
namespace Blog;  
echo __NAMESPACE__;  
?>

Saída:

Blog

A utilização de namespaces tem benefícios bastante óbvios durante a depuração. Também pode ser usada para gerar dinamicamente um nome de classe completamente qualificado. Por exemplo:

<?php  
namespace Blog;

class MinhaClasse {  
    public function WhoAmI() {
        return __METHOD__;
    }
}

$c = __NAMESPACE__ . '\MinhaClasse';
$m = new $c;
echo $m->WhoAmI();  
?>

Saída:

Blog\MinhaClasse::WhoAmI