## 命名空間
命名空間簡單的說就是類似文件的路徑。為了解決命名沖突的問題產生的。比如在我們的代碼中經常遇到以下問題。
自己在一個目錄寫了一個類叫A. 另外一個人也寫了一個類叫A。就會產生一個沖突。最初的框架,比如ci框架,都是類的名字前面加上一CI_的前綴防止命名沖突。
命令空間的思想來源于路徑。比如在一個/www/目錄下不能存在兩個相同的文件。但是可以文件放在/www/a/ 、/www/b下面,這樣兩個文件就不會沖突。同理命名空間。如果在\www\a\A、\www\b\A 這兩個類也可以可以同時存在的。
命名空間的定義使用**namespace** 定義。只有類(包括抽象類和traits)、接口、函數和常量受到命名空間的影響。
命名空間的定義必須在腳本的首行。不能有bom,否則會出錯。
定義子命名空間用\分割。
也可以在一個文件定義多個命名空間。但是一般不這么做。
```php
namespace app;
#子命名空間
namespace app\model;
namespace app {
function test(){}
}
namespace app2{
function test(){}
}
namespace {
app\test();
app2\test();
}
```
### 命名空間基礎
命名空間和路徑原理相似。所以有相對、絕對
- 非限定名稱、不包含前綴的類名稱。類似a.php 比如include('a.php')
```php
$a = new Test();// 如果這個文件定義的命名空間是app。那么就是訪問的 app\Test類。
```
- 限定名稱,或包含前綴 類似 文件路徑中的 a/c.php這種形式
```php
$a = new model\Test(); //如果該文件的命名空間是app。則訪問的就是app\model\Test
```
- 完全限制 類似文件中的絕對路徑 /www/a.php
```php
$a = new \app\Test();
```
### 別名和導入
命名空間支持別名和引入外部的名字
所有支持命名空間的PHP版本支持三種別名或導入方式:為類名稱使用別名、為接口使用別名或為命名空間名稱使用別名
```php
namespace a;
use app\model;
use app\test\model as model2;
```
### 全局命名空間
如果沒有定義任何命名空間,所有的類與函數的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴?*\\*?表示該名稱是全局空間中的名稱
```php
namespace app;
function test(){
new \Redis();
}
```
### 名詞解析
```php
namespace A;
use B\D, C\E as F;
// 函數調用
foo(); // 首先嘗試調用定義在命名空間"A"中的函數foo()
// 再嘗試調用全局函數 "foo"
\foo(); // 調用全局空間函數 "foo"
my\foo(); // 調用定義在命名空間"A\my"中函數 "foo"
F(); // 首先嘗試調用定義在命名空間"A"中的函數 "F"
// 再嘗試調用全局函數 "F"
// 類引用
new B(); // 創建命名空間 "A" 中定義的類 "B" 的一個對象
// 如果未找到,則嘗試自動裝載類 "A\B"
new D(); // 使用導入規則,創建命名空間 "B" 中定義的類 "D" 的一個對象
// 如果未找到,則嘗試自動裝載類 "B\D"
new F(); // 使用導入規則,創建命名空間 "C" 中定義的類 "E" 的一個對象
// 如果未找到,則嘗試自動裝載類 "C\E"
new \B(); // 創建定義在全局空間中的類 "B" 的一個對象
// 如果未發現,則嘗試自動裝載類 "B"
new \D(); // 創建定義在全局空間中的類 "D" 的一個對象
// 如果未發現,則嘗試自動裝載類 "D"
new \F(); // 創建定義在全局空間中的類 "F" 的一個對象
// 如果未發現,則嘗試自動裝載類 "F"
// 調用另一個命名空間中的靜態方法或命名空間函數
B\foo(); // 調用命名空間 "A\B" 中函數 "foo"
B::foo(); // 調用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
// 如果未找到類 "A\B" ,則嘗試自動裝載類 "A\B"
D::foo(); // 使用導入規則,調用命名空間 "B" 中定義的類 "D" 的 "foo" 方法
// 如果類 "B\D" 未找到,則嘗試自動裝載類 "B\D"
\B\foo(); // 調用命名空間 "B" 中的函數 "foo"
\B::foo(); // 調用全局空間中的類 "B" 的 "foo" 方法
// 如果類 "B" 未找到,則嘗試自動裝載類 "B"
// 當前命名空間中的靜態方法或函數
A\B::foo(); // 調用命名空間 "A\A" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\A\B" 未找到,則嘗試自動裝載類 "A\A\B"
\A\B::foo(); // 調用命名空間 "A\B" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\B" 未找到,則嘗試自動裝載類 "A\B"
```
- PC
- IO模型
- Inode介紹
- Linux
- Linux基本操作命令
- Linux網絡相關命令
- Crontab計劃任務
- Shell
- Sed命令
- Awk命令
- LAMP/LNMP
- PHP
- 基本語法
- 面向對象
- 錯誤和異常處理
- 命名空間
- PHP7
- 正則表達式
- Hashtable
- 變量的內部實現
- PHP-FPM
- PHP運行原理
- swoole
- mysql
- SQL標準
- mysql三范式
- 存儲引擎
- Mysql事務
- Mysql索引
- Mysql優化
- Explain
- MySQL索引原理及慢查詢優化
- MongoDb
- 計算機網絡
- IP協議
- TCP(傳輸控制協議)
- UDP(用戶數據報協議)
- HTTP 協議
- HTTPS
- HTTP的基本優化
- Websocket協議
- 版本控制器
- Git
- Svn
- 數據結構
- 數組
- 鏈表
- 算法