關於對tp5框架中的命名空間的理解


前幾天和朋友聊起了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;
     //這個根就是所有后來設置的命名空間的根


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM