1、命名空間的引入原因
命名空間的引入是為了解決變量或者函數(shù)的名字沖突;
舉個(gè)例子來說,
對(duì)于文件A.php 、B.php 和C.php 這三個(gè)文件;
A.php 文件中 有變量定義為 $a=1;
B.php 文件中 有變量定義為 $a=1;
文件 C.php 中 引用 A 、B文件,并使用 變量 $a;
那么C.php中會(huì)使用何值?
2、關(guān)于同名變量中值的定義
此時(shí)系統(tǒng)不會(huì)出現(xiàn)任何錯(cuò)誤;但會(huì)出現(xiàn)下列問題:
一、include “a.php”;
? ? ? include "b.php"
則使用的是b.php 中定義值;
二、include "b.php";
? ? ? include "a.php";
則使用的是a.php 中的定義值;
由此可見,文件引入的順序不同,變量的定義值完全不同。采用的覆蓋的原則;因此具有變量值的不確定性。
3、命名空間的本質(zhì)
PHP 命名空間可以解決以下兩類問題:
1.用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
2.為很長的標(biāo)識(shí)符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個(gè)別名(或簡短)的名稱,提高源代碼的可讀性。
命名空間的本質(zhì)還是一個(gè)標(biāo)識(shí)符,這個(gè)標(biāo)識(shí)符用來作為容器,來標(biāo)識(shí)該代碼空間下的所有內(nèi)容。
在被引用的PHP 文件中引入了命名空間之后,如果應(yīng)用部分未使用空間名稱,會(huì)直接造成變量無法解析。因?yàn)榇藭r(shí)的變量名稱已經(jīng)改變了,全稱應(yīng)該是空間名+本地變量名稱。
4、命名空間與文件路徑的關(guān)系
<?php
header("Content-type:text/html;charset=utf-8");
include_once "./modelA/a.php";
include_once "./modelB/a.php";
use modelA\a;
use modelB\a as b;
a::out();
echo "<br/>";
$b = new b();
$b->out();
---------------------
在這種方法中,需要使用iniclude_once()方法引入文件,也需要使用命名空間。可能有些人會(huì)認(rèn)為:不是已經(jīng)使用use modelA\a了嗎,那就應(yīng)該把文件引入進(jìn)來了,為什么還要include_once()一下呢?那是因?yàn)閡se modelA\a僅僅是聲明要使用modelA命名空間下的a文件,可以理解為邏輯上的使用,為了防止重名。而include_once()則是物理上的使用,將代碼導(dǎo)入到c.php中。use 和 include缺一不可。
---------------------
Laravel?采用?classmap?方式進(jìn)行自動(dòng)加載(autoload),PHP雖然有了命名空間這個(gè)高級(jí)特性,但是這只是邏輯關(guān)系,require?文件還是要有的。
這個(gè)類和文件的對(duì)應(yīng)關(guān)系就存在?/vendor/composer/autoload_classmap.php?,每次?composer?dump-autoload?都會(huì)重新編譯、生成。