Usando namespaces: fallback para função/constante global

(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 constante, ele resolve com diferentes prioridades. Nomes de classe sempre são resolvidos para o nome do namespace atual. Assim para o acessar classes de usuário internas ou sem namespace, deve-se referir a elas como nome totalmente qualificado como em:

Exemplo #1 Acessando classes globais dentro de 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 retornará para funções ou constantes globais se a função ou constante com namespace não existir.

Exemplo #2 Fallback de funções/constantes globais dentro de 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" - fallback para 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";
}
?>

add a note

User Contributed Notes 1 note

up
33
markus at malkusch dot de
8 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