命名空間和動(dòng)態(tài)語(yǔ)言特征

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

PHP 命名空間的實(shí)現(xiàn)受到其語(yǔ)言自身的動(dòng)態(tài)特征的影響。因此,如果要將下面的代碼轉(zhuǎn)換到命名空間中:

示例 #1 動(dòng)態(tài)訪問(wèn)元素

example1.php:

<?php
class classname
{
    function 
__construct()
    {
        echo 
__METHOD__,"\n";
    }
}
function 
funcname()
{
    echo 
__FUNCTION__,"\n";
}
const 
constname "global";

$a 'classname';
$obj = new $a// 輸出 classname::__construct
$b 'funcname';
$b(); // 輸出 funcname
echo constant('constname'), "\n"// 輸出 global
?>
必須使用完全限定名稱(包括命名空間前綴的類名稱)。注意因?yàn)樵趧?dòng)態(tài)的類名稱、函數(shù)名稱或常量名稱中,限定名稱和完全限定名稱沒(méi)有區(qū)別,因此其前導(dǎo)的反斜杠是不必要的。

示例 #2 動(dòng)態(tài)訪問(wèn)命名空間的元素

<?php
namespace namespacename;
class 
classname
{
    function 
__construct()
    {
        echo 
__METHOD__,"\n";
    }
}
function 
funcname()
{
    echo 
__FUNCTION__,"\n";
}
const 
constname "namespaced";

/* 注意,如果使用雙引號(hào),要這樣寫(xiě) "\\namespacename\\classname" */
$a '\namespacename\classname';
$obj = new $a// 輸出 namespacename\classname::__construct
$a 'namespacename\classname';
$obj = new $a// 也會(huì)輸出 namespacename\classname::__construct
$b 'namespacename\funcname';
$b(); // 輸出 namespacename\funcname
$b '\namespacename\funcname';
$b(); // 也會(huì)輸出 namespacename\funcname
echo constant('\namespacename\constname'), "\n"// 輸出 namespaced
echo constant('namespacename\constname'), "\n"// 也會(huì)輸出 namespaced
?>

請(qǐng)一定別忘了閱讀 對(duì)字符串中的命名空間名稱轉(zhuǎn)義的注解.