Uso de espacios de nombres: retorno al espacio global para funciones y constantes
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
En un espacio de nombres, cuando PHP encuentra un nombre sin calificación,
ya sea una clase, una función o una constante, lo resuelve con diferentes
prioridades. Los nombres de clases siempre se resuelven con el espacio de nombres actual.
Para acceder a clases internas o a clases que no están en
un espacio de nombres, es necesario representarlas con su nombre absoluto, como:
Ejemplo #1 Acceso a clases globales desde un espacio de nombres
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a es un objeto de la clase A\B\C\Exception
var_dump($a::class);
$b = new \Exception('hi'); // $b es un objeto de la clase Exception
var_dump($b::class);
$c = new ArrayObject; // error fatal, clase A\B\C\ArrayObject no encontrada
Para las funciones y constantes, PHP las buscará en el espacio
global si no puede encontrarlas en el espacio de nombres actual.
Ejemplo #2 Acceso a funciones y constantes globales en un espacio de nombres
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // muestra "45"
echo INI_ALL, "\n"; // muestra "7": acceso al espacio de nombres global INI_ALL
echo strlen('hi'), "\n"; // muestra "1"
if (is_array('hi')) { // muestra "no es un array"
echo "es un array\n";
} else {
echo "no es un array\n";
}
markus at malkusch dot de ¶11 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.