PHP 8.3.21 Released!

Uso de los espacios de nombres: retorno al espacio global para las funciones y las 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 las clases globales desde un espacio de nombres

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

$a = new Exception('hola'); // $a es un objeto de la clase A\B\C\Exception
$b = new \Exception('hola'); // $b es un objeto de la clase Exception

$c = new ArrayObject; // error fatal, no se encontró la clase A\B\C\ArrayObject
?>

Para las funciones y constantes, PHP irá a buscarlas en el espacio global si no puede encontrarlas en el espacio de nombres actual.

Ejemplo #2 Acceso a las 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"; // imprime "45"
echo INI_ALL, "\n"; // imprime "7" - recurre a INI_ALL global

echo strlen('hola'), "\n"; // imprime "3"
if (is_array('hola')) { // imprime "no es un array"
echo "es una array\n";
} else {
echo
"no es un array\n";
}
?>

add a note

User Contributed Notes 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