前幾天和朋友聊起了tp框架,突然說起了命名空間,才發覺自己對這個定義並不是很了解,所以特地去查了一些相應的資料,在這里記一下,以防日后忘記。
首先先引用一下tp官網中對命名空間的解釋:
從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統中目錄用來將相關文件分組,對於目錄中的文件來說,它就扮演了命名空間的角色。具體舉個例子,文件foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到/home/greg/foo.txt。這個原理應用到程序設計領域就是命名空間的概念。點擊進入官網查看
在這里我使用一些簡單的例子來進行說明理解:
一般來說在同一個PHP文件中,是不能有同名的函數的(不同類中可以)例如:
<?php
function test(){
}
function test(){
}
很明顯會報test()重定義的錯誤。
但是如果我們使用了命名空間對其進行分類,例如:
<?php
namespace first;
function test(){
}
namespace seccond;
function test(){
}
這樣程序就不會出現問題,由此我們可以知道,命名空間類似於一個小房間,但是這個房間僅支持類,函數,或者const修飾的變量居住,假設有兩個同名叫Tom的人,性別相同,住在同一個房間里,如果某人在房外大喊Tom,我們並無法知道他叫的是哪個Tom,甚至兩個Tom也不知道是在叫誰,但是如果我們把兩個人放在兩個房間里,如A房間,B房間,我們就可以通過加上房間前綴來區別具體是哪個Tom,這也就是命名空間的作用所在,
一般來說命名空間分為一級命名空間和多級命名空間,學過TP5的人就知道,當我們新建一個控制器的時候,總是要聲明命名空間,一般是這樣的(還沒開始學的看第一句就好):
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
use think\Request;
use app\index\model\User;
use think\Captcha;
class Index extends Controller
{
public function index()
{
$data=Db::name('think_data')->select();
$this->assign('data',$data);
return view();
}
}
namespace app\index\controller 這就是一個多級命名空間,也是一個非完全限定訪問方式。
那么我們是怎么訪問不同命名空間的資源的呢。很簡單,有過一點網站開發基礎的人就知道,引用資源我們有兩種方式,一種是相對路徑引用,另一種是絕對路徑引用。命名空間與其類似但是它實際上分為三種訪問方式,例如:
<?php
namespace first;//第一個命名空間
const a=1;
function test()
{
echo '我是第一個命名空間'.'<br/>';
}
namespace second;//第二個命名空間
const a=2;
function test()
{
echo '我是第二個命名空間'.'<br/>';
}
//三種訪問方式示例
//第一種: 非限定名稱訪問方式 直接調用,會使用默認的命名空間下
test(); //打印出 我是第二個命名空間
echo a.'<br/>'; //打印出 2
//第二種:非完全限定訪問方式,類似於相對路徑訪問,會以現在的命名空間作為基點。
a\b\test();//實際完全路徑為 seccond\a\b\test(),但是實際上我並沒有這個方法。所以會報錯
//第三種:完全限定訪問方式。類似於絕對路徑。實際就是第二種加個根(\)
\first\test();//打印出 我是第一個命名空間
echo \first\a;
//這個根就是所有后來設置的命名空間的根
