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 面試題:類名沖突的解決方法
題目描述:一個項目中有多個相同的類,如何使用才能避免沖突。
解答:參考類的解析規則,讀者需要了解三種規則及其適用條件。
- Pandas Cookbook
- Debian 7:System Administration Best Practices
- Access 數據庫應用教程
- Java EE框架整合開發入門到實戰:Spring+Spring MVC+MyBatis(微課版)
- 單片機C語言程序設計實訓100例:基于STC8051+Proteus仿真與實戰
- 機器人Python青少年編程開發實例
- Mastering Kali Linux for Web Penetration Testing
- Visual C
- Getting Started with Python Data Analysis
- Java Web程序設計任務教程
- Corona SDK Mobile Game Development:Beginner's Guide(Second Edition)
- Node.js開發指南
- CRYENGINE Game Development Blueprints
- 創意UI:Photoshop玩轉APP設計
- JavaScript從入門到精通(視頻實戰版)