被包含的檔案將預設使用全域命名空間。
<?php
//test.php
namespace test {
include 'test1.inc';
echo '-',__NAMESPACE__,'-<br />';
}
?>
<?php
//test1.inc
echo '-',__NAMESPACE__,'-<br />';
?>
test.php 的執行結果
--
-test-
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
若沒有任何命名空間定義,所有類別和函式定義都會放置在全域空間中 - 就像在 PHP 支援命名空間之前一樣。在名稱前面加上 \
將指定即使在命名空間的上下文中也需要從全域空間取得該名稱。
範例 #1 使用全域空間規範
<?php
namespace A\B\C;
/* 這個函式是 A\B\C\fopen */
function fopen() {
/* ... */
$f = \fopen(...); // 呼叫全域 fopen
return $f;
}
?>
被包含的檔案將預設使用全域命名空間。
<?php
//test.php
namespace test {
include 'test1.inc';
echo '-',__NAMESPACE__,'-<br />';
}
?>
<?php
//test1.inc
echo '-',__NAMESPACE__,'-<br />';
?>
test.php 的執行結果
--
-test-
請注意,變數不屬於命名空間的一部分,因此它們始終是全域的(或屬於函數作用域等),並且無法像其他命名空間元素一樣被訪問。
所以以下程式碼無效
namespace Foo;
$var = "hello";
echo \Foo\$var;
在命名空間的環境下,Exception 類別需要加上全域前綴運算子。
<?php
namespace hey\ho\lets\go;
class MyClass
{
public function failToCatch()
{
try {
$thing = somethingThrowingAnException();
} catch (Exception $ex) {
// 未捕捉到
}
}
public function succeedToCatch()
{
try {
$thing = somethingThrowingAnException();
} catch (\Exception $ex) {
// 現在已捕捉到
}
}
}
要定義一個關聯式陣列(雜湊),使其成為命名空間的一部分,而不是進入全域命名空間,只需將其宣告為 const,而不是變數。
這對於查找表、設定檔等非常方便。
// 範例。不要寫成
$my_datatypes = [
"sterility" => [
"xlsx" => [
"Sample Type",
"Run Pass/Fail",
"Result"
],
"db" => [
"SampleType",
"RunPassFail",
"Result"
]
]
];
// ...而是像這樣宣告查找表
const MY_DATATYPES = [
"sterility" => [
"xlsx" => [
"Sample Type",
"Run Pass/Fail",
"Result"
],
"db" => [
"SampleType",
"RunPassFail",
"Result"
]
]
];
// ...這樣它就會在目前的命名空間內被宣告。