PHP命名空間namespace
什麼是namespace?
官方解釋命名空間是 一種封裝事物的方法。例如,在操作系統中目錄用來將相關文件分組,對於目錄中的文件來說,它就扮演了命名空間的角色。具體舉個例子,文件 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個原理應用到程序設計領域就是命名空間的概念。
namespace 的定義和使用
-
定義:
<?php namespace Myproject;
或者:
<?php namespace Myproject{ }
-
使用
<?php use Myproject/School
或者
<?php use Myproject/School AS MYSchool
命名空間是運行時解析的。use 就相當於一處聲明,並不解析和加載。比如下面這個例子:
-
test.php
<?php use my\name; require_once("/home/yejianfeng/handcode/test/namespace1.php"); $a = new my\name\A(); $a->Print1();
-
namespace1.php
<?php namespace my\name; class A { public function Print1(){ echo 11; } }
孫然test.php的require_once 在use的下面,也是可以正常運行的,因爲程序只喲偶在new my\name\A() 的時候,纔會去架子啊命名空間my\name
全局類和命名空間類
- 如果要new一個全局類使用 new \A()
- 如果要new一個命名空間類,使用new my\namespace\A()
命名空間的順序
<?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"
?>
原文來自:http://www.cnblogs.com/yjf512/archive/2013/05/14/3077285.html