假設有下面兩個文件: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
/*如下屬於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 '\' ?>
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"; }
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;
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定義的常量是從屬於其命名空間的,在其餘命名空間訪問須要加命名空間的限定