關於對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;
     //這個根就是全部後來設置的命名空間的根

php

相關文章
相關標籤/搜索