namespace命名空间的使用
一、何為命名空間
PHP 命名空間(namespace)是在PHP 5.3中加入的。“什么是命名空間?從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統中目錄用來將相關文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。具體舉個例子,文件 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個原理應用到程序設計領域就是命名空間的概念。”命名空間可以解決以下兩類問題:
二、命名空間的使用概要
Tips:以下示例中成為了兩個文件,一個Demo.php,一個index.php,兩個文件處于同級目錄下;Demo.php文件中書寫命名空間以及Demo類,index.php調用Demo.php中的Demo類;如下示例中的“輸出結果”即表示瀏覽器訪問index.php。
(一)、簡單示例
Demo.php文件代碼:
<?php namespace DemoNameSpace;class Demo {private $mysqlHandle;public function __construct() {echo '這是PHP演示的名稱空間,(PHP的魔術常量"__NAMESPACE__")當前命名空間的名稱是 '.__NAMESPACE__;} } ?>index.php文件代碼:
<?phpinclude 'Demo.php';use DemoNameSpace\Demo;$DemoObj = new Demo(); ?>輸出結果:這是PHP演示的名稱空間,(PHP的魔術常量"__NAMESPACE__")當前命名空間的名稱是DemoNameSpace
以上示例中使用的魔法常量__NAMESPACE__的意思是當前命名空間的名稱(區分大小寫)。
(二)、報錯示例
Demo.php不做變動,改動index.php文件,如下:
<?phpinclude 'Demo.php';$Demo = new Demo(); ?>輸出結果:“Fatal error: Class ‘Demo’ not found in D:\WWW\demo\index.php on line 4”
這個是常見的“致命錯誤”信息。之所以會出現這樣的錯誤,是因為我們在Demo.php中使用了命名空間:namespace DemoNameSpace 。我們把Demo.php中的這行代碼注釋掉后。這個語句,就正常了。這是咱們平常寫class以及調用class最常見的書寫方法,這里就不介紹了。
對比使用namespace與不使用namespace的兩種輸出情況,并加入namespace的定義理解后,上述出現致命錯誤的情況就很好理解了。在Demo.php中定義了一個namespace,也就是命名空間后,接著定義了Demo類,然后這個Demo類就被歸并到了DemoNameSpace命名空間中去了,那么要調用這個Demo類時,自然要先調用這個DemoNameSpace命名空間了,也就是在index.php文件中使用“useDemoNameSpace\Demo”語句了。
(三)、稍復雜的示例
Demo.php文件代碼:
<?php header("content-type:text/html;charset=utf-8); namespace DemoNameSpace; class Demo {private $mysqlHandle;public function __construct() {echo '這是PHP演示的名稱空間,(PHP的魔術常量"__NAMESPACE__")當前命名空間的名稱是 '.__NAMESPACE__;} }namespace DemoNameSpace1; const constDefine = 'Tom'; class Demo {private $mysql;const constant = 'Jerry';public function __construct() {echo 'The const constant outside class is: '.constDefine;echo ' and ';echo 'The const constant inside class is: '.self::constDefine;} } ?>index.php文件代碼
<?php// 在同級目錄下include 'Demo.php';use DemoNameSpace\Demo as Test;//給同類名添加別名$Demo = new Test;echo "<br/>";//換行use DemoNameSpace1\Demo as Test1;//給同類名添加別名$Demo1 = new Test1();echo "<hr/>";//橫線echo DemoNameSpace1\constDefine; ?>輸出結果:
這是PHP演示的名稱空間,(PHP的魔術常量"NAMESPACE")當前命名空間的名稱是DemoNameSpace`
The const constant outside class is: Tom and The const constant inside class is: Jerry Tom
三、namespace總結
1、namespace前面不要有任何代碼,注釋除外。不管是header("content-type:text/html;charset=utf-8);還是其他什么代碼。都要放在namespace的后面。否則會報錯。
2、命名空間下直接new該命名空間中的class名稱,可以省略掉use語法,這是php按腳本書寫順序執行導致的。同一腳本下new一個沒有指定use哪個命名空間時,會順著該腳本,使用最靠近new語句之前的一個命名空間中的class。
3、公共空間:可以簡單的理解,沒有定義命名空間的方法(函數)、類庫(class)、屬性(變量)都默認歸屬于公共空間。這樣就解釋了為php5.3.0以前版本書寫的代碼大部分為何在php5.3.0及其以上版本還能正常運行的原因。另外:公共空間中的代碼段被引入到某個命名空間下后,該公共空間中的代碼段不屬于任何命名空間!
4、就如目錄結構一樣,命名空間也有子命名空間的概念,具體就不再舉例說明了。
總結
以上是生活随笔為你收集整理的namespace命名空间的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql5.7.12安装问题
- 下一篇: HBae找不到协处理器导致RegionS