Namespaces verwenden: Rückgriff auf globale Funktion/Konstante

(PHP 5 >= 5.3.0)

Wenn PHP innerhalb eines Namespace auf einen unqualifizierten Namen für einen Klasen-, Funktions- oder Konstantennamen trifft, so werden diese mit unterschiedlichen Prioritäten aufgelöst. Klassennamen werden immer auf den aktuellen Namespace aufgelöst. Um also auf interne Klassen oder Benutzerklassen ohne Namespace zuzugreifen, muss man diese mit ihrem vollständig qualifizierten Namen ansprechen:

Beispiel #1 Zugriff auf globale Klasse innerhalb eines Namespace

namespace A\B\C;
Exception extends \Exception {}

$a = new Exception('hi'); // $a ist ein Objekt der Klasse A\B\C\Exception
$b = new \Exception('hi'); // $b ist ein Objekt der Klasse Exception

$c = new ArrayObject// fatal error, die Klasse A\B\C\ArrayObject konnte
                      // nicht gefunden werden

Für Funktionen und Konstanten wird PHP auf globale Funktionen oder Konstanten zurückgreifen, wenn eine Funktion oder Konstante im Namespace nicht existiert.

Beispiel #2 Rückgriff auf globale Funktionen/Konstanten innerhalb eines Namespace

namespace A\B\C;

    return \
strlen($str) - 1;

E_ERROR"\n"// gibt "45" aus
echo INI_ALL"\n"// gibt "7" aus - Rückgriff auf globale INI_ALL

echo strlen('hi'), "\n"// gibt "1" aus
if (is_array('hi')) { // gibt "ist kein Array" aus
echo "ist Array\n";
} else {
"ist kein Array\n";

add a note add a note

User Contributed Notes 2 notes

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

namespace foo;

time() {

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.
cory at xison dot ca
1 year ago
I want to throw it out there, I found the following easier to deal with when porting parts of some older code into a new project in regards to accessing global classes.

namespace app\somethingorother;
use \
core as core;



I know it's not exactly the same as the solutions mentioned above, but it works for what I'm trying to accomplish.
To Top