[TOC]
# 命名空間概述
在PHP中,命名空間用來解決在編寫類庫或應用程序時創建可重用的代碼(如類或函數時),碰到的兩類問題:
* 用戶編寫的代碼與PHP內部的類/函數/常量或者第三方類/函數/常量之間的名字沖突
* 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提升源代碼的可讀性
>[danger] 名為PHP或php的命名空間,以及以這些名字開頭的命名空間(例如PHP\Classes)被保留用作語言內核使用,而不應該在用戶空間的代碼中使用。
# 定義命名空間
(PHP 5 >= 5.3.0, PHP 7)
雖然任意合法的PHP代碼都可以包含在命名空間中,但只有以下類型的代碼受命名空間的影響,它們是:類(包括抽象類和traits)、接口、函數和常量。
命名空間通過關鍵字namespace 來聲明(所有非 PHP 代碼包括空白符都不能出現在命名空間的聲明之前)。
## 聲明單個命名空間
~~~
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
~~~
## 定義子命名空間
與目錄和文件的關系很象,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義
## 聲明分層次的單個命名空間
~~~
<?php
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
~~~
## 在同一個文件中定義多個命名空間
也可以在同一個文件中定義多個命名空間。在同一個文件中定義多個命名空間有兩種語法形式。
### 定義多個命名空間,大括號語法
~~~
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
~~~
### 定義多個命名空間,簡單組合語法(不推薦)
~~~
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
~~~
>[info] 在實際的編程實踐中,非常不提倡在同一個文件中定義多個命名空間。這種方式的主要用于將多個 PHP 腳本合并在同一個文件中。
[TOC]
## 使用命名空間
**在文件系統中訪問一個文件有三種方式**
* 相對文件名形式如foo.txt。它會被解析為 currentdirectory/foo.txt,其中 currentdirectory 表示當前目錄。因此如果當前目錄是 /home/foo,則該文件名被解析為/home/foo/foo.txt。
* 相對路徑名形式如subdirectory/foo.txt。它會被解析為 currentdirectory/subdirectory/foo.txt。
* 絕對路徑名形式如/main/foo.txt。它會被解析為/main/foo.txt。
**PHP 命名空間中的元素使用同樣的原理**
* 非限定名稱,或不包含前綴的類名稱,例如 `$a=new foo();` 或 `foo::staticmethod();`。如果當前命名空間是 `currentnamespace`,foo 將被解析為 `currentnamespace\foo`。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會被解析為foo。 警告:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全局函數名稱或常量名稱。詳情參見 使用命名空間:[后備全局函數名稱/常量名稱](http://php.net/manual/zh/language.namespaces.fallback.php)。
* 限定名稱,或包含前綴的名稱,例如 `$a = new subnamespace\foo();` 或 `subnamespace\foo::staticmethod();`。如果當前的命名空間是 currentnamespace,則 foo 會被解析為 `currentnamespace\subnamespace\foo`。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會被解析為`subnamespace\foo`。
* 完全限定名稱,或包含了全局前綴操作符的名稱,例如, `$a = new \currentnamespace\foo();` 或 `\currentnamespace\foo::staticmethod();`。在這種情況下,foo 總是被解析為代碼中的文字名`(literal name)currentnamespace\foo`。
- 開始
- PHP配置參數的介紹
- PHP代碼優化
- php中的命名空間
- PHP文件上傳類
- PHP文件下載
- PHP驗證碼
- ThinkPHP3.2 框架函數
- A函數:實例化控制器
- C函數:設置和獲取配置參數
- D函數:實例化模型
- F 函數:快速緩存設置和存取
- M函數:例化模型(無需定義模型類)
- L函數:設置和獲取語言變量
- S 函數:緩存設置和存取
- R函數:直接調用控制器的操作方法
- U函數:URL地址生成
- I 函數:安全獲取系統輸入變量
- 日志
- ThinkPHP在關閉調試模式導致函數被緩存
- MySQL觸發器使用時遇到的坑
- PHP常用函數
- 五一回家記錄
- window的PHP開發(wamp)下安裝redis擴展
- Windows下安裝使用Redis
- PHP7新特性
- 利用 phpmailer 類實現隊列發送郵件
- GD 庫圖像處理
- 檢測 PHP 模塊是否開啟
- GD 庫操作一般步驟
- GD 庫繪畫改變字體
- GD 繪制驗證碼
- GD 縮略圖實現
- GD 繪制水印
- 日期時間函數庫
- PHP 函數
- 無限極分類