官术网_书友最值得收藏!

5.3 命名空間

命名空間是對類的層級結構的一種封裝方式,類似于操作系統的目錄。在不同的命名空間下,用戶不用擔心類/函數/常量的名字沖突,在引入第三方類庫時,也不用擔心名字沖突。

在引入其他命名空間之下的類庫時,如果標識符名稱沖突或過長,可以使用use as來創建別名。

5.3.1 命名空間的使用規范

1.命名空間的定義

使用namespace來定義命名空間。定義命名空間的規則非常寬松,即“命名空間的定義必須放在程序里的第一條語句”。參考以下示例:(源碼文件:ch05/basic/phpbook.php)

2.使用命名空間

使用命名空間的關鍵字為use,PHP支持三種使用方式:

(1)使用類use class

use PHPBook\Demo;//使用命名空間之下的類

(2)使用函數use function

use function PHPBook\say_hello;//使用命名空間之下的函數

(3)使用常量use const

use const PHPBook\HELLO_STRING;//使用命名空間之下的常量

具體程序示例如下:(源碼文件:ch05/basic/test_namespace.php)

<?php
include './phpbook.php';
use function PHPBook\say_hello;//使用命名空間之下的函數
use const PHPBook\HELLO_STRING;//使用命名空間之下的常量
use PHPBook\Demo;//使用命名空間之下的類
say_hello();
//output:Hello World
echo HELLO_STRING;
//output:Hello World
$demo = new Demo();
$demo->say_hello();
//output:Hello World

3.別名關鍵字as

在引入其他命名空間之下類庫時,如果標識符名稱沖突或過長,可以使用use as來創建別名。

use PHPBook\Demo as Demo;//使用命名空間之下的類
use function PHPBook\say_hello as say_hello;//使用命名空間之下的函數
use const PHPBook\HELLO_STRING as HELLO_STRING;//使用命名空間之下的常量

4.類的解析規則

如果使用中引入了多個命名空間下的名稱相同的類,那么PHP解析時如何知道引用的哪個類呢?要回答這個問題,需要知道類的解析規則:

● 規則1:類名無前綴,則解析后完整類目為“當前命名空間+類名”。

● 規則2:類名有前綴,則解析后完整類目為“當前命名空間+子命名空間+類名”。

● 規則3:類名以全局前綴\開始,為完整路徑,無須解析。

為了解釋這些規則,我們來看代碼文件ch05/prefix下的示例,文件目錄結構如下:

./test_prefix.php
./foo/demo.php
./foo/bar/demo.php

其中./foo/demo.php定義了Demo類:

(源碼文件:ch05/prefix/foo/demo.php)

./foo/bar/demo.php的定義與./foo/demo.php類似,只有命名空間不同,不再贅述:

namespace PHPBook\Foo\Bar;

./test_prefix.php的第6至10行也定義了一個名稱為Demo的類,以下程序代碼演示如何使用3個相同的類。

(源碼文件:ch05/prefix/test_prefix.php)

第12行直接不加任何前綴的使用了Demo類,此時適用規則1,最終引用的類名為“當前命名空間+類名”。

第16行,前綴(或稱為子命名空間)為Foo,適用規則2,最終引用的類名為“當前命名空間+子命名空間+類名”。

第20行,類名以全局前綴\開始,為完整路徑,適用規則3,無須解析。

5.全局命名空間

由于命名空間是PHP 5.3版本引入的特性,在此之前,PHP已經有大量的類和函數。為了向下兼容,這些無命名空間的類,默認為全局命名空間,使用時需要加上前綴\。例如在其他命名空間下,$class = new StdClass()需要更改為$class = new \StdClass()。

6.命名空間最佳實踐

遵守PSR-0和PSR-4標準。

PHP并沒有規定命名空間與文件的對應關系,例如在文件foo\a.php里定義類\FOO\BAR是可以的。但不推薦這么做。一般而言,\FOO\BAR對應的文件應為foo\bar.php。PSR標準將在下節進行詳細講述。

● 一個文件只包含一個命名空間。

PHP支持同一個文件里定義多個命名空間,但強烈不建議,因為這樣會使程序的可讀性變差。

● 一個use只使用一個命名空間。

PHP支持一個use使用多個命名空間,例如:

但不建議如此使用,因為增加、刪除、更改use語句時容易出錯。

5.3.2 面試題:命名空間

題目描述:命名空間是什么,為什么需要命名空間?

答案見本節開頭部分的講解,讀者需要閉卷回答以上問題。

5.3.3 面試題:類名沖突的解決方法

題目描述:一個項目中有多個相同的類,如何使用才能避免沖突。

解答:參考類的解析規則,讀者需要了解三種規則及其適用條件。

主站蜘蛛池模板: 老河口市| 延津县| 张北县| 万荣县| 溧阳市| 惠来县| 松滋市| 亚东县| 自治县| 乌恰县| 山阴县| 莒南县| 九龙坡区| 永仁县| 翁源县| 宁国市| 朔州市| 神农架林区| 铜梁县| 商都县| 五峰| 武胜县| 白河县| 团风县| 兴和县| 和平县| 宁陕县| 成安县| 孝感市| 页游| 济宁市| 台中县| 江都市| 北海市| 高州市| 简阳市| 读书| 大安市| 平邑县| 霍邱县| 嵊州市|