* 命名空間的聲明與使用
* 1.使用關鍵字:namespace
* 2.php5.3+
* 3.namespace 之前不能有除了declare和注釋之外的任何代碼,html也不行
* 4.命名空間預設從全域開始定位,全域空間用\表示,類似於根目錄
* 5.如果當前指令碼聲明了命名空間,則所有成員的訪問,就必須使用命名空間,包括系統函數
//1. 聲明一個命名空間
namespace one;class Demo{public $name='Peter Zhu';}const SITE='topic.alibabacloud.com';function add($a,$b){return $a+$b;}
//如果我想聲明同名的類,常量與函數可以再聲明一個命名空間
//2.一個指令碼中允許有多個命名空間
//聲明命名空間:two,使用\tow\進行引用
namespace two;
//現在聲明類Demo,常量SITE,函數add,則不會衝突
class Demo{public $name='朱老師';}const SITE = 'www.php.cn';function add($a,$b){return $a+$b;}
//相信大家看出來了,這非常像是在不同的目錄下面,允許建立同名檔案,原理是一樣的
echo (new Demo)->name, '<br>'; //預設輸出的是當前空間的內容
//查看一下當前的命名空間是什麼?使用系統預置常量:__NAMESPACE__
echo '當前命名空間是: ',__NAMESPACE__,'<br>';
//也可以帶上當前的命名空間來訪問當前空間中的成員
//產生帶有當前命名空間的類名
$className = __NAMESPACE__.'\Demo';echo (new $className)->name,'<br>';
//可以帶上完整的命名空間名稱,從全域空間\開始,相當於從根目錄開始
//專業術語: 完全限定名稱
echo (new \two\Demo)->name, '<hr>';
//3.如何?跨空間訪問?
//如果我們要訪問空間one中的Demo類中的屬性,如何操作呢?
//跨空間訪問,與跨目錄訪問檔案一樣,一定要帶上它完整的空間路徑
//例如我們要訪問one空間的類Demo中的成員
echo 'one空間的類成員:',(new \one\Demo)->name,'<br>';
//4.在聲明了命名空間的指令碼中,如何訪問系統預定義方法?
//例如聲明了一個單字元數組
$welcome = 'php中文網歡迎您';\print_r($welcome); echo '<br>';print($welcome); echo '<hr>';
//剛才我們說過,在空間中訪問全域成員,必須要加\,這裡沒有加為什麼可以?
//因為如果使用者沒有添加,那麼會首先在本空間中尋找有沒有var_dump()函數,
//如果沒有找到,再到全域空間尋找,所以不報錯
//但是如果我們在當前的two空間中也建立一個var_dump()函數,則只會執行
//當前空間中使用者自訂的var_dump(),系統同名函數不會被調用
function print_r($arg){ echo '我是當前空間聲明的函數調用:'.$arg;}print_r($welcome); echo '<br>';
//等價調用文法:
\two\print_r($welcome);
//注意: 此print_r(),與系統內建的print_r()無任何關係,僅名稱相同而已
//就好比,上海有條長江路,咱們合肥也有一條長江路一樣,這二條路除名稱一樣,再無任何關係
// 上海市寶山區長江路
// 合肥市廬陽區長江路
// 相信沒有人會認為這是同一條路?
//事實上,這二個函數的完整調用語句應該是這樣的:
//1.調用系統的:
\print_r($welcome);
//2.調用當前空間的:
\two\print_r($welcome);
//儘管後面名稱一樣,但是歸屬地是不同的