phpday 2025 - Call For Papers

Usando namespaces: recorrendo ao espaço global para funções e constantes

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

Dentro de um namespace, quando o PHP encontra um nome não qualificado em um nome de classe, função ou contexto de constante, eles são resolvidos com diferentes prioridades. Nomes de classe sempre são resolvidos para o nome do namespace atual. Portanto, para acessar classes internas ou classes de usuário sem namespace, deve-se referir a elas com o nome totalmente qualificado como em:

Exemplo #1 Acessando classes globais em um namespace

<?php
namespace A\B\C;
class
Exception extends \Exception {}

$a = new Exception('oi'); // $a é um objeto da classe A\B\C\Exception
$b = new \Exception('oi'); // $b é um objeto da classe Exception

$c = new ArrayObject; // erro fatal, classe A\B\C\ArrayObject não encontrada
?>

Para funções e constantes, o PHP recorrerá a funções ou constantes globais se a função ou constante com namespace não existir.

Exemplo #2 Recorrendo a funções/constantes globais em um namespace

<?php
namespace A\B\C;

const
E_ERROR = 45;
function
strlen($str)
{
return
\strlen($str) - 1;
}

echo
E_ERROR, "\n"; // imprime "45"
echo INI_ALL, "\n"; // imprime "7" - recorre à constante INI_ALL global

echo strlen('oi'), "\n"; // imprime "1"
if (is_array('oi')) { // imprime "não é array"
echo "é array\n";
} else {
echo
"não é array\n";
}
?>

adicione uma nota

Notas Enviadas por Usuários (em inglês) 1 note

up
36
markus at malkusch dot de
10 years ago
You can use the fallback policy to provide mocks for built-in functions like time(). You therefore have to call those functions unqualified:

<?php
namespace foo;

function
time() {
return
1234;
}

assert (1234 == time());
?>

However there's a restriction that you have to define the mock function before the first usage in the tested class method. This is documented in Bug #68541.

You can find the mock library php-mock at GitHub.
To Top