命名空間就是用虛擬的類似目錄層次結構的方式組織php**,
避免與其他團隊或個人**融合時產生類名衝突,並遵循psr-4**載入規範
(1)命名空間的宣告
命名空間的宣告以namespace 關鍵字開頭的語句並以;結尾,且必須在
<?php 後的第一行使用
如:
<?php
namespace pay;
如果有子命名空間可以加入 \子命名空間
如:
<?php
namespace pay/alipay
(2)命名空間的使用
命名空間的使用是使用use關鍵字
比如 :我們可以直接使用
use pay\alipay; //宣告一般在namespace 後面
$alipay = new alipay();
而不用在頁面的每個需要使用alipay的地方使用繁瑣的語句來例項化
$alipay = new \pay\alipay();
引入命名空間的時候也有可能有重名的類:
比如:
use foo/httpresponse;
這個時候直譯器就不清楚你想用的到底是上面的類還是下面的類了,這個時候你可以使用 as 關鍵字給你引入的命名空間起上簡單的別名。
這樣系統就很直接了當的知道你要例項化的是 my/httpresponse 了。
(3) 命名空間的誤區
我一直也懷疑,學了上面的命名空間,我是不是就可以直接使用命名空間來解決我的**引入的問題了?我們來看個栗子:
a/testa.php
<?php
namespace a;
class testa
}
testb.php
<?php
use a\testa;
$a = new testa();
$a->sayhi();
然後我們執行 testb.php
hp fatal error: class 'a\testa' not found in testb.php on line 2
額,怎麼說好的命名空間自動引入的呢,不是忽悠人的嘛。
別生氣,psr-4 規範中提到的命名空間自動引入是有前提條件的,需要修改自動引入機制。
php預設的自動引入類是查詢當前檔案是否有需要例項化的類名,如果沒有,則查詢全域性的包和擴充套件類中是否有,都沒有就只能報錯了。那麼我們怎麼才能不報錯呢?將如下**
spl_autoload_register(function ($class)
}});
加入testb.php中
<?php
namespace b;
use a\testa;
spl_autoload_register(function ($class)
}});$a = new testa();
$a->sayhi();
然後我們執行 testb.php
hi獲得了預期的結果,不知道你發沒發現,我們使用命名空間時 spl_autoload_register 函式中我們純粹是使用替換規則替換了一下 '\',這樣我們其實可以得出個結論,我們使用『_』|'::' 或者其他符合變數命名
規則的取名都可以作為命名空間的名字,但是一般為了替換方便,我們約定俗成的使用了'\'.
至於更為複雜的命名空間簡化串,可以參考,psr-4中的例子
全域性命名空間裡面有個例外,就是 exception
我們在使用命名空間的時候,如果想使用系統的exception 必須使用
$e = new \exception();
如果直接使用:
$e = new exception();
會報錯,找不到當前命名空間下的exception,不過好在大部分的框架重新封裝了exception,大部分都會自動引入框架的異常處理類。不過出現報錯的時候,一般可能是這個原因。
使用前提,php version >= 5.6
使用規則:
<?php
use func home\funcname;
funcname();
<?php
use constant home\api_key;
echo api_key;
C CLI程式設計(一 命名空間)
net 命名空間 說明 system 包含用於定義常用值和引用資料型別 事件和事件處理程式 介面 特性和處理異常的基礎類和基類 system collections system collections generic 這些命名空間定義了一些集合容器物件,還有一些基型別和介面,可以允許使用者建立強制...
PHP 命名空間 一
無命名空間 class lister namespace my require once product.php class lister lister test 訪問本地 from my lister test 訪問全域性空間 from global前導的反斜槓告訴php從根命名空間而不是從當前命...
Clean Code 筆記 一) 命名
一 命名規範 1.名副其實,通過名稱我們知道它為什麼存在,它做什麼事,該怎麼用 2.避免誤導,避免使用與本意相悖的詞,提防使用不同之處較小的名稱 3.有意義的區分,去掉多餘的廢話比如 a,the。缺少明確約定容易出現歧義 4.使用讀的出來和可搜尋的名稱,二 避免使用編碼 1.把變數型別加入變數名稱 ...