Глобальное пространство имён
Без определения какого-либо пространства имён, все определения классов и функциий оказываются в глобальном пространстве - как это было в PHP до появления поддержки пространств имён. Префиксирование имени знаками :: указывает, что имя из глобального пространства имён - работает даже в контексте пространства имён.
Пример #1 Использование указания на глобальное пространство имён
<?php
namespace A::B::C;
/* This function is A::B::C::fopen */
function fopen() {
/* ... */
$f = ::fopen(...); // вызывает глобальную fopen
return $f;
}
?>
- Обзор пространств имен
- Определение пространств имен
- Определение подпространств имен
- Описание нескольких пространств имен в одном файле
- Использование пространства имен: основы
- Пространства имен и динамические особенности языка
- Ключевое слово namespace и константа __NAMESPACE__
- Использование пространств имен: импорт/создание псевдонима имени
- Глобальное пространство
- Использование пространств имен: переход к глобальной функции/константе
- Правила разрешения имен
- Часто задаваемые вопросы (FAQ): вещи, которые вам необходимо знать о пространствах имен
Коментарии
Included files will default to the global namespace.
<?php
//test.php
namespace test {
include 'test1.inc';
echo '-',__NAMESPACE__,'-<br />';
}
?>
<?php
//test1.inc
echo '-',__NAMESPACE__,'-<br />';
?>
Results of test.php:
--
-test-
In namespaced context the Exception class needs to be prefixed with global prefix operator.
<?php
namespace hey\ho\lets\go;
class MyClass
{
public function failToCatch()
{
try {
$thing = somethingThrowingAnException();
} catch (Exception $ex) {
// Not catched
}
}
public function succeedToCatch()
{
try {
$thing = somethingThrowingAnException();
} catch (\Exception $ex) {
// This is now catched
}
}
}
Note that variables aren't part of the namespace so they are always global (or scoped to function, etc.) and can't be accessed the same way as other namespace stuff.
So no:
namespace Foo;
$var = "hello";
echo \Foo\$var;
To define an associative array (hash) so that it is part of the namespace, instead of going into the global namespace, just declare it as const, istead of as a variable.
This is handy for lookup tables, config settings, etc.
// Example. Instead of writing:
$my_datatypes = [
"sterility" => [
"xlsx" => [
"Sample Type",
"Run Pass/Fail",
"Result"
],
"db" => [
"SampleType",
"RunPassFail",
"Result"
]
]
];
// ...declare the lookup table like this:
const MY_DATATYPES = [
"sterility" => [
"xlsx" => [
"Sample Type",
"Run Pass/Fail",
"Result"
],
"db" => [
"SampleType",
"RunPassFail",
"Result"
]
]
];
// ...and it will be declared within the current namespace.