CakeFest 2024: The Official CakePHP Conference

Palavra-chave namespace e constante __NAMESPACE__

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

O PHP suporta duas maneiras de acessar elementos de forma abstrata dentro do namespace atual, a constante mágica __NAMESPACE__ e a palavra-chave namespace.

O valor de __NAMESPACE__ é uma string que contém o nome do namespace atual. Em código global, sem namespace, ela contém uma string vazia.

Exemplo #1 Exemplo de __NAMESPACE__, código com namespace

<?php
namespace MeuProjeto;

echo
'"', __NAMESPACE__, '"'; // produz "MeuProjeto"
?>

Exemplo #2 Exemplo de __NAMESPACE__, código global

<?php

echo '"', __NAMESPACE__, '"'; // produz ""
?>
A constante __NAMESPACE__ é útil para construir nomes de forma dinâmica, por exemplo:

Exemplo #3 Usando __NAMESPACE__ para construção dinâmica de nomes

<?php
namespace MeuProjeto;

function
get($nomedaclasse)
{
$a = __NAMESPACE__ . '\\' . $nomedaclasse;
return new
$a;
}
?>

A palavra-chave namespace pode ser usada para solicitar explicitamente um elemento do namespace atual ou um subnamespace. Ela é o equivalente para namespaces do operador self para classes.

Exemplo #4 O operador namespace, em um namespace

<?php
namespace MeuProjeto;

use
bla\bla as meu; // Veja "Usando namespaces: Apelidando/Importando"

bla\meu(); // chama a função MeuProjeto\bla\meu()
namespace\bla\meu(); // chama a função MeuProjeto\bla\meu()

namespace\funcao(); // chama a função MeuProjeto\funcao()
namespace\sub\funcao(); // chama a função MeuProjeto\sub\funcao()
namespace\nomedaclasse::metodo(); // chama o método estático "metodo" da classe MeuProjeto\nomedaclasse
$a = new namespace\sub\nomedaclasse(); // instancia um objeto da classe MeuProjeto\sub\nomedaclasse
$b = namespace\CONSTANTE; // atribui o valor da constante MeuProjeto\CONSTANTE a $b
?>

Exemplo #5 O operador namespace, em código global

<?php

namespace\funcao
(); // chama a função funcao()
namespace\sub\funcao(); // chama a função sub\funcao()
namespace\nomedaclasse::metodo(); // chama o método estático "metodo" da classe nomedaclasse
$a = new namespace\sub\nomedaclasse(); // instancia um objeto da classe sub\nomedaclasse
$b = namespace\CONSTANTE; // atribui o valor da constante CONSTANTE a $b
?>

add a note

User Contributed Notes 3 notes

up
88
a dot schaffhirt at sedna-soft dot de
14 years ago
Just in case you wonder what the practical use of the namespace keyword is...

It can explicitly refer to classes from the current namespace regardless of possibly "use"d classes with the same name from other namespaces. However, this does not apply for functions.

Example:

<?php
namespace foo;
class
Xyz {}
function
abc () {}
?>

<?php
namespace bar;
class
Xyz {}
function
abc () {}
?>

<?php
namespace bar;
use
foo\Xyz;
use
foo\abc;
new
Xyz(); // instantiates \foo\Xyz
new namespace\Xyz(); // instantiates \bar\Xyz
abc(); // invokes \bar\abc regardless of the second use statement
\foo\abc(); // it has to be invoked using the fully qualified name
?>

Hope, this can save someone from some trouble.

Best regards.
up
-1
bharatthapa45 at gmail dot com
1 year ago
Difference between __NAMESPACE__ and keyword 'namespace' that I find relevant is when invoking a class:

<?php
namespace MyApp;

class
App {
static function
app(){
echo
'hello app';
}
}

// this will work:
$obj = new namespace\App::app();

// this will not work
$obj = new __NAMESPACE__\App::app();

// however this will work:
$obj = __NAMESPACE__ . '\App';
$obj::foo();

?>
up
-26
cornichonche at gmail dot com
6 years ago
The example 4 is wrong.
Using php 7.2

<?php
namespace monProjet;

use function
blah\blah as mine;

blah\mine(); // Will NOT work
mine(); // Will work
?>
To Top