現代PHP一(命名空間)

2021-08-16 18:05:31 字數 2520 閱讀 4983

命名空間就是用虛擬的類似目錄層次結構的方式組織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.把變數型別加入變數名稱 ...