PHP命名空間

命名空間的概念:

什麼是命名空間?引用官網上的一段話:php

從廣義上來講,命名空間是一種封裝事物的方法。在不少地方均可以見到這種抽象概念。例如,在操做系統中【目錄】用來將相關文件分組,對於【目錄】中的文件來講,它就扮演了命名空間的角色。舉個具體的栗子,在Windos操做系統中,文件 foo.txt 能夠同時在目錄 d:/example1 和 d:/example2 中存在,但在同一個目錄中最多隻能存在一個 foo.txt 文件。另外,在【目錄】 之外訪問 foo.txt 文件時,咱們必須將正確【目錄】名以及【目錄】分隔符放在文件名以前。這個原理應用到程序設計領域就是命名空間的概念。數組

命名空間的做用:

命名空間一般用來解決兩大類問題:函數

1.用戶編寫的代碼與【PHP內部的類/函數/常量】 或者【第三方類/函數/常量】之間的命名衝突。

舉個栗子:你正在維護一個項目,其中有一個文件: Member.php , 其中有一個功能:查詢全部用戶的基本資料,而後使用CSV文件導出,導出數據到CSV文件的功能是以前的一個哥們寫的:他把功能封裝到了一個方法裏:OutputStream()。然而,很是不幸,此時客戶新增長了一個需求:導出用戶的所有資料,而且保留以前導出基本資料的功能。假設因爲個別緣由,你不想再使用以前那哥們寫的 OutputStream() 方法,須要借用第三方類庫:PHPExcel,最後當你配置成功而且載入類庫文件準備開工時,卻收到了錯誤信息:OutputStream() 方法重複了(這裏假設 PHPExcel 類庫中也有一個方法叫作 OutputStream(), 若是能有個惟一標識該多好?spa

2.爲很長的命名建立一個別名(或簡短)的名稱,提升源代碼的可讀性。

回到剛纔的問題,爲了解決 OutputStream()方法衝突問題,你想到了一個辦法:把以前那哥們寫的 OutputStream() 加一個項目前綴:My_OutputStream(), 而後大功告成(若是 OutputStream() 只有一處地方調用)。然而,隨着項目的日積月累,項目中相似 My_…() 這種代碼愈來愈多,維護也變得日益麻煩。操作系統

定義命名空間:

PHP命名空間中能夠包含任意的PHP代碼,可是最終只有三種類型會受到影響:類、函數、常量,變量和數組等是沒有命名空間的概念的。.net

規則:

1.命名空間使用 namespace 來聲明;
2.若是一個文件中包括命名空間,它必須在全部 PHP 代碼前聲明命名空間;
3.全部非 PHP 代碼包括空白符都不能出如今命名空間的聲明前;設計

簡單地來講,若是你要在一個文件中使用命名空間,這樣寫就對了:code

namespace FrameWork\MyFrameWork;

定義子命名空間:

與目錄和文件的關係很象,PHP命名空間也容許指定層次化的命名空間的名稱。所以,命名空間的名字可使用分層次的方式定義:ip

namespace FrameWork\MyFrameWork;
namespace FrameWork\MyFrameWork\Model;
namespace FrameWork\MyFrameWork\Controller;

在同一個文件中定義多個命名空間:

這個功能你們知道便可,在實際的項目開發中,應該不會出如今同一個文件中定義多個命名空間的這種狀況。
詳情請看官方文檔:在同一個文件中定義多個命名空間開發

PHP 中命名空間解析規則:

1.沒有任何前綴的類名稱。

例如一個類爲 Controller, 若是當前命名空間是 FrameWork , Controller 會被解析爲 FrameWork\Controller.若是當前命名空間不存在,則 Controller 是全局的。

2.包含前綴的類名稱。

例如 $exampe = Base\Example(), 若是當前命名空間是 Controller, 則 Example 會被解析爲 Controller\Base\Example, 若是當前命名空間是 Model, 則 Example 會被解析爲 Model\Base\Example, 若是當前命名空間不存在,則 Exampl 會被解析爲 Base\Example, (PS:這種解析方式相似 Windows 中相對路徑)。

3.包含 「” + 前綴的類名稱。

例如 $exampe = \Base\Example(), 則 Example 會被解析爲 Base\Example, (PS:這種解析方式相似 Windows 中絕對路徑)。

小技巧:最前面有 「” 是絕對路徑,反之是相對路徑。

舉個栗子:

/**
* namespace2.php
*/

namespace FrameWork\Base\Controller;
 
class Example 
{
    public static function here() 
    {
        echo 'Namespace is FrameWork\Base\Controller !!<br />';
    }
}

/**
* namespace1.php
*/

namespace FrameWork\Base;

class Example 
{
    public static function here() 
    {
        echo 'Namespace is FrameWork\Base !!<br />';
    }
}

include ('namespace3.php');

//  第一種解析方式:
Example::here();   // Namespace is FrameWork\Base !!

// 第二種解析方式:
Controller\Example::here();  // Namespace is FrameWork\Base\Controller !!

// 第三種解析方式:
\FrameWork\Base\Example::here();                // Namespace is FrameWork\Base !!
\FrameWork\Base\Controller\Example::here();     // Namespace is FrameWork\Base\Controller !!

namespace 關鍵字 和 __NAMESPACE__ 常量

namespace: 用來顯式訪問當前命名空間或子命名空間中的元素。

namespace\Example::here();    // Namespace is FrameWork\Base !!

__NAMESPACE__ : 當前命名空間的字符, 若是當前命名空間爲空, 則返回」。

echo __NAMESPACE__;    // FrameWork\Base

命名空間的別名

PHP 命名空間支持兩種別名方式:爲類名稱使用別名、爲命名空間名稱使用別名。注意:PHP不支持函數或常量別名。

經過操做符 use 實現別名。

/**
* namespace4.php
*/

namespace FrameWork\Base\Controller;
 
class Example 
{
    public static function here() 
    {
        echo 'Namespace is FrameWork\Base\Controller !!<br />';
    }
}

/**
* namespace3.php
*/

namespace Model;

include ('namespace4.php');

use FrameWork\Base\Controller\Example as FBCExample;     

\FrameWork\Base\Controller\Example::here();     // Namespace is FrameWork\Base\Controller !!
FBCExample::here();                             // Namespace is FrameWork\Base\Controller !!
相關文章
相關標籤/搜索