此篇文章作為我從開始學習php到工作一段時間後的命名空間知識點總結,會隨學習和工作的提高而完善
命名空間
定義命名空間意義
一:為了解決多檔案中(相互引入時)類名,常量名,函式名可能會重複命名的問題
二:快速定位檔案位置
三:就是給檔案加個隱式字首
四:命名空間需要寫在檔案的最前面
全域性空間
如果沒有定義任何命名空間,所有的類與函式的定義都是在全域性空間,與 php 引入命名空間概念前一樣。
在名稱前加上字首 \ 表示該名稱是全域性空間中的名稱,即使該名稱位於其它的命名空間中時也是如此。
可模擬linux的根木錄/
乙個檔案多個命名空間
按定義名稱理解即可
定義方式:按上下文順序書寫
a.php
namespace:***
**1namespace:yyy
**2當然,多個檔案的命名空間也可相同
例如
$a=new foo();
//或$a=foo::staticmethod();
//如果當前命名空間是currentnamespace,foo 將被解析為 currentnamespace\foo
限定名稱
//限定名稱,或包含字首的名稱,例如
$a = new subnamespace\foo();
//或 subnamespace\foo::staticmethod();
//如果當前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo
完全限定名稱
//完全限定名稱,或包含了全域性字首操作符的名稱,例如
$a = new \currentnamespace\foo();
//或
\currentnamespace\foo::staticmethod();
//在這種情況下,foo 總是被解析為**中的文字名(literal name)currentnamespace\foo
就我個人而言,完全限定名稱使用頻率最多,它從全域性空間\出發,描述了呼叫類,方法,常量相對全域性的位置,定位精確
額外細節
如果在當前【命名空間】中使用某乙個類,預設優先順序是當前空間查詢並使用,;
所有要在當前命名空間內使用且不屬於當前空間的類,需要先導入一下該類,比如pdo這個php的擴充套件類
<?php
中
$pdo = new \pdo();//此處通過完全限定名稱匯入全域性空間的pdo類,該類被內置於php的pdo擴充套件中
函式和常量有所不同
函式常量執行的機制:先在當前空間查詢,如果沒有找到則退而使用全域性空間的函式、常量(php內部自動按優先順序查詢),物件導向的程式設計過程中基本都是類物件式的呼叫,函式和常量設計較少
匯入命名空間
通常來說使用完全限定名稱的時候會面臨需要前面寫一大長串的完全限定名稱的麻煩,尤其在乙個類多個方法裡多次呼叫時,這裡就引出了匯入的概念
允許通過別名引用或匯入外部的完全限定名稱,是命名空間的乙個重要特徵。這有點類似於在類 unix 檔案系統中可以建立對其它的檔案或目錄的符號連線
下方例子引自php官方手冊
<?php
namespace foo;
use my\full\classname as another;
// 下面的例子與 use my\full\nsname as nsname 相同
use my\full\nsname;
// 匯入乙個全域性類
use arrayobject;
// importing a function (php 5.6+)
use function my\full\functionname;
// aliasing a function (php 5.6+)
use function my\full\functionname as func;
// importing a constant (php 5.6+)
use const my\full\constant;
$obj = new namespace\another; // 例項化 foo\another 物件
$obj = new another; // 例項化 my\full\classname 物件
nsname\subns\func(); // 呼叫函式 my\full\nsname\subns\func
$a = new arrayobject(array(1)); // 例項化 arrayobject 物件
// 如果不使用 "use \arrayobject" ,則例項化乙個 foo\arrayobject 物件
func(); // calls function my\full\functionname
echo constant; // echoes the value of my\full\constant
?>
為了簡化操作,php還支援在一行中使用多個use語句
<?php
use my\full\classname as another, my\full\nsname;
$obj = new another; // 例項化 my\full\classname 物件
nsname\subns\func(); // 呼叫函式 my\full\nsname\subns\func
?>
為了解決require檔案後呼叫其中類,函式方法每次呼叫時都要載入完全限定名稱
我們使用了匯入解決,換言之,匯入可有可無,但有了可以簡化操作(非常簡化!強烈推薦使用)
匯入操作是在編譯執行的,但動態的類名稱、函式名稱或常量名稱則不是。
一些重要細節:
有了命名空間後,我們如果還是想之前那樣require了含有命名空間的檔案
直接呼叫require過來的**是會出錯的
必須先使用空間或者匯入空間後才能使用
命名空間的動態語言特性
命名空間可以儲存到變數中,這就體現了動態語言的特性
如果把命名空間儲存到變數中的話,必須使用完全限定名稱,
由於限定名稱和完全限定名稱沒有區別,因此其前導的反斜槓是不必要的。
命名空間 PHP筆記
命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念,比如在作業系統中,目錄用來將相關檔案分組,對於目錄中的檔案來說,目錄就扮演了命名空間的角色。這個原理應用到程式設計領域就是命名空間的概念。php 5.3後的版本開始支援命名空間。命名空間通過關鍵字namespace來宣告。任何合法的ph...
命名空間 PHP手冊筆記
原文 命名空間 php手冊筆記 命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念,比如在作業系統中,目錄用來將相關檔案分組,對於目錄中的檔案來說,目錄就扮演了命名空間的角色。這個原理應用到程式設計領域就是命名空間的概念。php 5.3後的版本開始支援命名空間。命名空間通過關鍵字name...
命名空間 PHP手冊筆記
原文 命名空間 php手冊筆記 命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念,比如在作業系統中,目錄用來將相關檔案分組,對於目錄中的檔案來說,目錄就扮演了命名空間的角色。這個原理應用到程式設計領域就是命名空間的概念。php 5.3後的版本開始支援命名空間。命名空間通過關鍵字name...