## 命名空間
命名空間(Namespace)表示標識符(identifier)的可見范圍。一個標識符可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。
簡單說來命名空間是為了解決不同庫在同一個環境下使用時出現的命名沖突。例如我自己有一個函數名叫 A,但是系統已經有一個 A 函數了,那就會出現沖突。
### 全局空間
如果沒有定義任何命名空間,所有的類與函數的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 \ 表示該名稱是全局空間中的名稱。
### 定義命名空間
- 在定義的命名空間之前不能有任何輸出。如 html 代碼等。
- 在聲明命名空間之前唯一合法的代碼是用于定義源文件編碼方式的 declare 語句,如:declare(encoding='UTF-8');
- 只在文件開頭進行命名空間定義,并且只定義一個。
- 通常命名空間要遵循 PSR-0 命名規范(命名空間和目錄結構保持一致)。
**注意:** 只有 const, function, class 受命名空間的約束。
文件 foo.php
```
<?php
namespace app\foo;
const E_ERROR = 'foo_error';
function md5($str)
{
return \md5('123'. $str . '123');
}
class Test
{
public function getNamespace()
{
return __NAMESPACE__;
}
}
?>
```
文件 bar.php
```
<?php
namespace app\bar;
const E_ERROR = 'bar_error';
function md5($str)
{
return \md5('abc'. $str . 'abc');
}
class Test
{
public function getNamespace()
{
return __NAMESPACE__;
}
}
?>
```
### 使用命名空間
**元素引用**
命名空間中元素的三種引用方式:
- 非限定名稱:訪問當前命名空間。(在當前文件中直接使用)
- 限定名稱:類似于相對路徑,訪問當前空間下的子命名空間,如:new People\Person();
- 完全限定名稱:類似于絕對路徑,訪問全局空間,如:new \Person();
**導入/別名**
允許通過別名引用或導入外部的完全限定名稱,是命名空間的一個重要特征。這有點類似于在類 unix 文件系統中可以創建對其它的文件或目錄的符號連接。
在 PHP 中,別名是通過 use 操作符來實現的;
```
<?php
namespace app\test;
use app\foo;
use app\bar as BB;
require 'foo.php';
require 'bar.php';
class Test
{
public function printNamespace()
{
return __NAMESPACE__;
}
}
/*----------- 引用靜態變量 ----------- */
echo '全局命名空間下的靜態變量:' . \E_ERROR . PHP_EOL;
echo 'app\foo 命名空間下的靜態變量:' . foo\E_ERROR . PHP_EOL;
echo 'app\bar 命名空間下的靜態變量:' . BB\E_ERROR . PHP_EOL;
/*----------- 引用函數 ----------- */
echo '全局命名空間下的函數:' . \md5('hello') . PHP_EOL;
echo 'app\foo 命名空間下的函數:' . foo\md5('hello') . PHP_EOL;
echo 'app\bar 命名空間下的函數:' . BB\md5('hello') . PHP_EOL;
/*----------- 引用類 ----------- */
$curTest = new Test();
$fooTest = new foo\Test();
$barTest = new BB\Test();
echo '當前命名空間下的方法:' . $curTest->getNamespace() . PHP_EOL;
echo 'app\foo 命名空間下的方法:' . $fooTest->getNamespace() . PHP_EOL;
echo 'app\bar 命名空間下的方法:' . $barTest->getNamespace() . PHP_EOL;
?>
```
- 基本語法
- PHP標記
- 指令分隔符
- 從HTML中分離
- 注釋
- 數據類型
- 布爾值
- 整數
- 浮點數
- 字符串
- 數組
- 對象
- 資源
- 空值
- 變量
- 基礎
- 預定義變量
- 變量范圍
- 可變變量
- 常量
- 常量語法
- 魔術常量
- 運算符
- 算術運算符
- 賦值運算符
- 位運算符
- 比較運算符
- 遞增與遞減運算符
- 邏輯運算符
- 字符串運算符
- 數組運算符
- 類型運算符
- 流程控制
- if條件結構
- switch條件結構
- while循環結構
- do-while循環結構
- for循環結構
- foreach循環結構
- 包含文件
- 函數
- 自定義函數
- 可變函數
- 匿名函數
- 遞歸函數
- 類與對象
- 基本概念
- 屬性
- 方法
- 類常量
- 構造函數和析構函數
- 訪問控制
- 繼承
- 抽象類
- 接口
- Trait
- 重載
- 對象遍歷
- 魔術方法
- Final關鍵字
- 命名空間
- 自動加載
- 錯誤處理
- 錯誤顯示
- 錯誤日志
- 錯誤報告
- 自定義錯誤處理
- 異常處理
- 異常處理機制
- 擴展異常處理類
- 字符操作
- 數組操作
- 時間操作
- 表單操作
- GET提交
- POST提交
- 文件上傳
- 會話控制
- COOKIE操作
- SESSION操作
- 文件操作
- 文件屬性
- 讀取文件
- 寫入文件
- 文件管理
- 文件鎖
- 目錄處理
- 路徑處理
- 網絡操作
- HTTP協議
- Socket操作
- CURL操作
- PDO操作
- 介紹
- 連接管理
- 預處理語句
- 事務處理
- 錯誤處理
- 圖像操作
- 正則表達式
- 標準推薦
- 包管理器
- 設計模式
- 常用算法
- 安全防御
- XSS防御
- CSRF防御