什么是namespace喷好?
官方解釋命名空間是 一種封裝事物的方法翔横。例如,在操作系統(tǒng)中目錄用來將相關(guān)文件分組梗搅,對于目錄中的文件來說禾唁,它就扮演了命名空間的角色。具體舉個例子无切,文件 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在荡短,但在同一個目錄中不能存在兩個 foo.txt 文件。另外哆键,在目錄 /home/greg 外訪問 foo.txt 文件時掘托,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個原理應(yīng)用到程序設(shè)計領(lǐng)域就是命名空間的概念洼哎。
namespace 的定義和使用
-
定義:
<?php namespace Myproject;
或者:
<?php namespace Myproject{ }
-
使用
<?php use Myproject/School
或者
?<?php use Myproject/School AS MYSchool
命名空間是運(yùn)行時解析的烫映。use 就相當(dāng)于一處聲明沼本,并不解析和加載噩峦。比如下面這個例子:
-
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的下面,也是可以正常運(yùn)行的抽兆,因為程序只喲偶在new my\name\A() 的時候识补,才會去架子啊命名空間my\name
全局類和命名空間類
- 如果要new一個全局類使用 new \A()
- 如果要new一個命名空間類,使用new my\namespace\A()
命名空間的順序
<?php
namespace A;
use B\D, C\E as F;
// 函數(shù)調(diào)用
foo(); // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù)foo()
// 再嘗試調(diào)用全局函數(shù) "foo"
\foo(); // 調(diào)用全局空間函數(shù) "foo"
my\foo(); // 調(diào)用定義在命名空間"A\my"中函數(shù) "foo"
F(); // 首先嘗試調(diào)用定義在命名空間"A"中的函數(shù) "F"
// 再嘗試調(diào)用全局函數(shù) "F"
// 類引用
new B(); // 創(chuàng)建命名空間 "A" 中定義的類 "B" 的一個對象
// 如果未找到辫红,則嘗試自動裝載類 "A\B"
new D(); // 使用導(dǎo)入規(guī)則凭涂,創(chuàng)建命名空間 "B" 中定義的類 "D" 的一個對象
// 如果未找到祝辣,則嘗試自動裝載類 "B\D"
new F(); // 使用導(dǎo)入規(guī)則,創(chuàng)建命名空間 "C" 中定義的類 "E" 的一個對象
// 如果未找到切油,則嘗試自動裝載類 "C\E"
new \B(); // 創(chuàng)建定義在全局空間中的類 "B" 的一個對象
// 如果未發(fā)現(xiàn)蝙斜,則嘗試自動裝載類 "B"
new \D(); // 創(chuàng)建定義在全局空間中的類 "D" 的一個對象
// 如果未發(fā)現(xiàn),則嘗試自動裝載類 "D"
new \F(); // 創(chuàng)建定義在全局空間中的類 "F" 的一個對象
// 如果未發(fā)現(xiàn)澎胡,則嘗試自動裝載類 "F"
// 調(diào)用另一個命名空間中的靜態(tài)方法或命名空間函數(shù)
B\foo(); // 調(diào)用命名空間 "A\B" 中函數(shù) "foo"
B::foo(); // 調(diào)用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
// 如果未找到類 "A\B" 孕荠,則嘗試自動裝載類 "A\B"
D::foo(); // 使用導(dǎo)入規(guī)則,調(diào)用命名空間 "B" 中定義的類 "D" 的 "foo" 方法
// 如果類 "B\D" 未找到攻谁,則嘗試自動裝載類 "B\D"
\B\foo(); // 調(diào)用命名空間 "B" 中的函數(shù) "foo"
\B::foo(); // 調(diào)用全局空間中的類 "B" 的 "foo" 方法
// 如果類 "B" 未找到稚伍,則嘗試自動裝載類 "B"
// 當(dāng)前命名空間中的靜態(tài)方法或函數(shù)
A\B::foo(); // 調(diào)用命名空間 "A\A" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\A\B" 未找到,則嘗試自動裝載類 "A\A\B"
\A\B::foo(); // 調(diào)用命名空間 "A\B" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\B" 未找到戚宦,則嘗試自動裝載類 "A\B"
?>
原文來自:[http://www.cnblogs.com/yjf512/archive/2013/05/14/3077285.html