PHP-命名空間

1.命名空間的意義

  假設有下面兩個文件:php

    include.php   函數

1 <?php  
2     function test(){
3      
4     };
5 ?>

     test.phpspa

1 <?php
2     include "include.php";
3 
4     function test(){
5 
6     };
7 ?>

   當腳本編譯時會提示這樣一個錯誤:code

    Fatal error: Cannot redeclare test() (previously declared in E:\xampp\htdocs\test.php:6) in E:\xampp\htdocs\include.php on line 4blog

  這是由於兩個文件中的test()函數重名了。這就是重名問題。解決這個問題的一個方法就是更更名字。io

  在一個大的項目中,代碼一般都是由不一樣的人編寫最後組合在一塊兒,重名問題經常發生。讓他們更改函數名是很是繁瑣的。編譯

  命名空間就是爲了解決這個問題而出現的。function

 

2.定義一個命名空間

  /*如下屬於testspace1命名空間*/
    /*注:第一個命名空間以前不能有任何PHP代碼否則會出錯*/
    namespace testspace1;
    echo __NAMESPACE__;echo "<br>";
    echo "**************<br>";

    /*如下屬於testspace1命名空間*/
    namespace testspace2;
    echo __NAMESPACE__;echo "<br>";
    echo "**************<br>";

    /*如下屬於testspace1命名空間*/
    namespace testspace3;
    echo __NAMESPACE__;echo "<br>";
    echo "**************<br>";

 

  命名空間開始與namespace語句,結束於新的namesapce語句或文件的結尾。class

 

  如今用命名空間解決上一個重名問題只須要這樣改寫代碼就能夠test

  include.php

1 <?php
2     namespace includespace;
3     function test(){
4         echo "i am from includespace <br>";
5     }
6 ?>

  test.php 

 1 <?php
 2     namespace testspace;
 3 
 4     include "include.php";
 5     function test(){
 6         echo "i am from testspace <br>";
 7     }
 8 
 9     test();//輸出i am from testspace
10     \includespace\test();//輸出i am from includespace
11 ?>

   

  沒有設置命名空間的都同屬於公共空間'\'。例如上一個例子,若是不給include.php設命名空間的話能夠這樣寫

  include.php

<?php
	function test(){
		echo "i am from '\' <br>";
	}
?>

  test.php

<?php
	namespace testspace;

	include "include.php";
	
	function test(){
		echo "i am from testspace <br>";
	}

	test();//輸出i am from testspace
	\test();//輸出i am from '\'
?>

  

3.命名空間的層次結構

namespace grandfa;
    function test(){
        echo "grandfa";
    }

    test();//grandfa非限定,自動匹配當前命名空間

    father\test();//father,限定名稱
    father\son\test();//son,限定名稱

    \grandfa\test();//grandfa,徹底限定名稱
    \grandfa\father\test();//father
    \grandfa\father\son\test();//son

/***************************************/
    namespace grandfa\father;
    // function test(){
    //     echo "father";
    // }


/**************************************/
    namespace grandfa\father\son;
    function test(){
        echo "son";
    }

 

4.導入命名空間和類

 1 <?php
 2     namespace grandfa;
 3     function test(){
 4         echo "grandfa";
 5     }
 6 
 7     $son1 = new father\son\son;
 8 /***************************************/
 9     namespace grandfa\father;
10     function test(){
11         echo "father";
12     }
13 
14 
15 /**************************************/
16     namespace grandfa\father\son;
17     function test(){
18         echo "son";
19     }
20 
21     class son{};
22 
23 ?>

  若是咱們想在grandfa的命名空間中調用son類,那麼咱們不得不在前面加上長長的前綴,在實際狀況中,前綴頗有可能要比這個長的多。

  咱們可使用導入別名的方式簡化使用

  use \grandfa\father\son as S;
    $son1=new S\son;

   這樣一來就不用每次使用長長的前綴,直接使用別名S就能夠了。

  若是你還嫌不夠簡單,甚至能夠直接導入一個類

  use \grandfa\father\son as S;
    $son1=new S\son;

 

5.命名空間與常量

 1 <?php
 2     namespace grandfa;
 3     define('DEA','1111');
 4     define('DEB','2222');
 5     const A='1111';
 6     const B='2222';
 7 
 8     echo A;echo B;
 9     echo DEA;echo DEB;
10 /***************************************/
11     namespace grandfa\father;
12     function test(){
13         echo "father";
14     }
15 
16     echo \grandfa\A;echo \grandfa\B;
17     echo DEA;echo DEB;
18 /**************************************/
19     namespace grandfa\father\son;
20     function test(){
21         echo "son";
22     }
23 
24     class son{};
25 
26     echo \grandfa\A;echo \grandfa\B;
27     echo DEA;echo DEB;
28 ?>

   define定義的常量是全局的任何命名空間均可以訪問,而const定義的常量是從屬於其命名空間的,在其餘命名空間訪問須要加命名空間的限定

相關文章
相關標籤/搜索