Visão geral de Namespaces

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

O que são namespaces? Na definição mais ampla, os namespaces (na tradução literal, "espaços de nomes") são uma forma de encapsular itens. Isso pode ser visto com um conceito abstrato em muitos lugares. Por exemplo, em qualquer sistema operacional os diretórios servem para agrupar arquivos relacionados, e agem como um namespace para os arquivos dentro dele. Como um exemplo concreto, o arquivo foo.txt pode exitir em ambos os diretórios /home/greg e /home/other, mas duas cópias de foo.txt não podem coexistir em um mesmo diretório. Além disso, para acessar o arquivo foo.txt fora do diretório /home/greg, devemos informar o nome do diretório antes do nome do arquivo usando o separador de diretórios para obter /home/greg/foo.txt. Esse mesmo princípio se estende a namespaces no mundo da programação.

No mundo PHP, os namespaces são projetados para resolver dois problemas que os autores de bibliotecas e aplicativos encontram ao criar elementos de código reutilizáveis, como classes ou funções:

  1. Nomear as colisões entre o código que você cria e classes/funções/constantes internas do PHP ou classes/funções/constantes de terceiros.
  2. Capacidade de criar apelidos (ou encurtar) Nomes_Extra_Longos projetados para aliviar o primeiro problema, melhorando a legibilidade do código-fonte.

Os Namespaces do PHP fornecem uma maneira de agrupar classes, interfaces, funções e constantes relacionadas. Aqui está um exemplo da sintaxe de namespace em PHP:

Exemplo #1 Exemplo da sintaxe de namespace

<?php
namespace meu\nome// veja a seção "Definindo Namespaces"

class MinhaClasse {}
function 
minhafuncao() {}
const 
MINHACONST 1;

$a = new MinhaClasse;
$c = new \meu\nome\MinhaClasse// veja a seção "Espaço Global"

$a strlen('oi'); // veja a seção "Usando namespaces: fallback para
                   // função/constante global"

$d = namespace\MINHACONST// veja a seção "operador de namespace 
                           // e constante __NAMESPACE__"
$d __NAMESPACE__ '\MINHACONST';
echo 
constant($d); // veja a seção "Namespaces e funcionalidades dinâmicas da linguagem" section
?>

Nota: Os nomes de namespace não diferenciam maiúsculas de minúsculas.

Nota:

O nome de Namespace PHP e nomes compostos que começam com esse nome (como PHP\Classes) são reservados para uso interno da linguagem e não devem ser usados no código de espaço de usuário.

add a note

User Contributed Notes 7 notes

up
830
SteveWa
11 years ago
Thought this might help other newbies like me...

Name collisions means:
you create a function named db_connect, and somebody elses code that you use in your file (i.e. an include) has the same function with the same name.

To get around that problem, you rename your function SteveWa_db_connect  which makes your code longer and harder to read.

Now you can use namespaces to keep your function name separate from anyone else's function name, and you won't have to make extra_long_named functions to get around the name collision problem.

So a namespace is like a pointer to a file path where you can find the source of the function you are working with
up
277
Dmitry Snytkine
11 years ago
Just a note: namespace (even nested or sub-namespace) cannot be just a number, it must start with a letter.
For example, lets say you want to use namespace for versioning of your packages or versioning of your API:

namespace Mynamespace\1;  // Illegal
Instead use this:
namespace Mynamespace\v1; // OK
up
18
shewa12kpi at gmail dot com
1 year ago
<?php
//Here is the simple use case of namespace. See how we can use same named class with the help of namespace. This is how namespace resolve naming collision.

namespace Mobile;

class
User
{

    public
$name = 'mobile user';
}

$user = new \Mobile\User;
echo
$user->name;

namespace
TV ;

class
User
{
    public static
$name = 'tv user';
}

echo \
TV\User::$name;
up
151
pierstoval at gmail dot com
7 years ago
To people coming here by searching about namespaces, know that a consortium has studied about best practices in PHP, in order to allow developers to have common coding standards.

These best practices are called "PHP Standard Recommendations" , also known as PSR.

They are visible on this link : http://www.php-fig.org/psr

Actually there are 5 coding standards categories :
PSR-0 : Autoloading Standard , which goal is to make the use of Namespaces easier, in order to convert a namespace into a file path.
PSR-1 : Basic Coding Standard , basically, standards :)
PSR-2 : Coding Style Guide, where to put braces, how to write a class, etc.
PSR-3 : Logger Interface , how to write a standard logger
PSR-4 : Improved Autoloading , to resolve more Namespaces into paths.

The ones I want to point are PSR-0 and PSR-4 : they use namespaces to resolve a FQCN (Fully qualified class name = full namespace + class name) into a file path.
Basic example, you have this directory structure :
./src/Pierstoval/Tools/MyTool.php

The namespacing PSR-0 or PSR-4 standard tells that you can transform this path into a FQCN.
Read the principles of autoload if you need to know what it means, because it's almost mandatory ;) .

Structure :
{path}/autoloader.php
{path}/index.php
{path}/src/Pierstoval/Tools/MyTool.php

Files :

<?php
   
// {path}/index.php
   
include 'autoloader.php';
   
$tool = new Pierstoval/Tools/MyTool();
?>

<?php
   
// {path}/src/Pierstoval/Tools/MyTool.php
   
namespace Pierstoval\Tools;
    class
MyTool {}
?>

<?php
   
// {path}/autoloader.php
   
function loadClass($className) {
       
$fileName = '';
       
$namespace = '';

       
// Sets the include path as the "src" directory
       
$includePath = dirname(__FILE__).DIRECTORY_SEPARATOR.'src';

        if (
false !== ($lastNsPos = strripos($className, '\\'))) {
           
$namespace = substr($className, 0, $lastNsPos);
           
$className = substr($className, $lastNsPos + 1);
           
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }
       
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
       
$fullFileName = $includePath . DIRECTORY_SEPARATOR . $fileName;
       
        if (
file_exists($fullFileName)) {
            require
$fullFileName;
        } else {
            echo
'Class "'.$className.'" does not exist.';
        }
    }
   
spl_autoload_register('loadClass'); // Registers the autoloader
?>

A standardized autoloader will get the class you want to instanciate (MyTool) and get the FQCN, transform it into a file path, and check if the file exists. If it does, it will <?php include(); ?> it, and if you wrote your class correctly, the class will be available within its correct namespace.
Then, if you have the following code :
<?php $tool = new Pierstoval/Tools/MyTool(); ?>
The autoloader will transform the FQCN into this path :
{path}/src/Pierstoval/Tools/MyTool.php

This might be the best practices ever in PHP framework developments, such as Symfony or others.
up
10
TonyMarston at tonymarston dot net
1 year ago
I should point out that namespaces were implemented in PHP to resolve name clashes in userland code. It was never the intention to eventually change the entire language to use namespaces instead of prefixes (ie: change mysqli_connect() to mysqli/connect()) as this would be a huge BC break.

I should also point out that the PSR standards created by the FIG group are *NOT* the official standards for PHP. While there are coding standards for contributing to PHP core, or for creating extensions, there are none for userland developers who are free to adopt whatever standards they choose.
up
-2
asma.mechtaba
6 months ago
we can also use namespaces to groupe traits
up
-15
Anonymous
1 year ago
php reserve keywords are not allowed as a namespace name.But namespace name "php" can be allowed.

Here are some example:

namespace php;//works
namespace class;//Parse error: syntax error, unexpected 'class'
namespace const;//Parse error: syntax error, unexpected 'const'
namespace constant;//works
namespace interface;//Parse error: syntax error, unexpected 'interface'
namespace function;//Parse error: syntax error, unexpected 'function'
To Top