PHP Conference Japan 2024

namespace 關鍵字與 __NAMESPACE__ 魔術常數

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

PHP 支援兩種抽象地存取目前命名空間內元素的方法,即 __NAMESPACE__ 魔術常數和 namespace 關鍵字。

__NAMESPACE__ 的值是一個包含目前命名空間名稱的字串。在全域、非命名空間的程式碼中,它包含一個空字串。

範例 #1 __NAMESPACE__ 範例,命名空間程式碼

<?php
namespace MyProject;

echo
'"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>

範例 #2 __NAMESPACE__ 範例,全域程式碼

<?php

echo '"', __NAMESPACE__, '"'; // 輸出 ""
?>
__NAMESPACE__ 常數可用於動態構建名稱,例如:

範例 #3 使用 __NAMESPACE__ 進行動態名稱構建

<?php
namespace MyProject;

function
get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new
$a;
}
?>

關鍵字 namespace 可用於明確地從目前的命名空間或子命名空間請求元素。它相當於類別中 self 運算子的命名空間版本。

範例 #4 命名空間運算子,在命名空間內

<?php
namespace MyProject;

use
blah\blah as mine; // 參考「使用命名空間:別名/導入」

blah\mine(); // 呼叫函式 MyProject\blah\mine()
namespace\blah\mine(); // 呼叫函式 MyProject\blah\mine()

namespace\func(); // 呼叫函式 MyProject\func()
namespace\sub\func(); // 呼叫函式 MyProject\sub\func()
namespace\cname::method(); // 呼叫類別 MyProject\cname 的靜態方法 "method"
$a = new namespace\sub\cname(); // 建立類別 MyProject\sub\cname 的物件
$b = namespace\CONSTANT; // 將常數 MyProject\CONSTANT 的值賦予 $b
?>

範例 #5 命名空間運算子,在全域程式碼中

<?php

namespace\func
(); // 呼叫函式 func()
namespace\sub\func(); // 呼叫函式 sub\func()
namespace\cname::method(); // 呼叫類別 cname 的靜態方法 "method"
$a = new namespace\sub\cname(); // 建立類別 sub\cname 的物件
$b = namespace\CONSTANT; // 將常數 CONSTANT 的值賦予 $b
?>

新增註解

使用者貢獻的註解 2 則註解

a dot schaffhirt at sedna-soft dot de
14 年前
如果您想知道 namespace 關鍵字的實際用途...

它可以明確地參考目前命名空間中的類別,無論是否從其他命名空間「use」了同名的類別。然而,這不適用於函式。

範例

<?php
namespace foo;
class
Xyz {}
function
abc () {}
?>

<?php
namespace bar;
class
Xyz {}
function
abc () {}
?>

<?php
namespace bar;
use
foo\Xyz;
use
foo\abc;
new
Xyz(); // 建立 \foo\Xyz 的實例
new namespace\Xyz(); // 建立 \bar\Xyz 的實例
abc(); // 呼叫 \bar\abc,無論第二個 use 陳述式為何
\foo\abc(); // 必須使用完整限定名稱來呼叫它
?>

希望這可以幫助一些人避免一些麻煩。

敬上。
bharatthapa45 at gmail dot com
2 年前
我發現 __NAMESPACE__ 和關鍵字 'namespace' 之間的區別在於呼叫類別時

<?php
namespace MyApp;

class
App {
static function
app(){
echo
'hello app';
}
}

// 這可以運作:
$obj = new namespace\App::app();

// 這無法運作
$obj = new __NAMESPACE__\App::app();

// 然而,這可以運作:
$obj = __NAMESPACE__ . '\App';
$obj::foo();

?>
To Top