在php中,use關(guān)鍵字可以用來導(dǎo)入命名空間,語法“use namespace;”;也可用來導(dǎo)入函數(shù)和常量,并為它們設(shè)置別名,語法“use 命名空間 as 別名;”。
本教程操作環(huán)境:windows7系統(tǒng)、PHP7.1版,DELL G3電腦
什么是命名空間?
從廣義上來說,命名空間是一種封裝事物的方法,在很多地方都可以見到這種抽象概念。例如,在操作系統(tǒng)中目錄用來將相關(guān)文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。
命名空間的定義
PHP 中命名空間(namespace)是在 PHP5.3 中加入的,如果你了解過 C++ 的話,那命名空間就不算什么新事物了。不過命名空間在 PHP 當(dāng)中還是相當(dāng)重要的。
PHP 命名空間可以解決以下兩類問題:
-
用戶編寫的代碼與 PHP 內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的命名沖突;
-
為很長的標(biāo)識符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個別名(或簡短)的名稱,以提高源代碼的可讀性。
定義命名空間(使用關(guān)鍵字 namespace)
雖然任意合法的 PHP 代碼都可以包含在命名空間中,但只有類(包括抽象類和 traits)、接口、函數(shù)和常量等類型的代碼受命名空間的影響。
命名空間的定義需要通過關(guān)鍵字 namespace 來聲明,語法格式如下:
namespace 命名空間名;
【示例】下面我們來演示一下如何定義了命名空間:
<?php namespace MyProject; // 定義名為 MyProject 的命名空間。 const CONNECT_OK = 1; class Myclass { /* ... */ } function Myfunc() { /* ... */ } ?>
在聲明命名空間之前除了用于定義源文件編碼方式的 declare 語句外,所有非 PHP 代碼(包括空白符)都不能出現(xiàn)在命名空間聲明之前。
使用命名空間:別名/導(dǎo)入
PHP 允許通過別名引用或?qū)氲姆绞絹硎褂猛獠康拿臻g,這是命名空間的一個重要特征。這有點(diǎn)類似于在類 unix 文件系統(tǒng)中可以創(chuàng)建對其它的文件或目錄的符號連接。
使用 use 關(guān)鍵字可以實現(xiàn)命名空間的導(dǎo)入,從 PHP5.6 開始允許導(dǎo)入函數(shù)和常量,并為它們設(shè)置別名。語法格式如下:
use namespace;
在 PHP 中,別名是通過操作符 use 與 as 來實現(xiàn)的,語法格式如下:
use 命名空間 as 別名;
【示例】使用 use 操作符導(dǎo)入和使用別名。
<?php namespace foo; use MyFullClassname as Another; // 下面的例子與 use MyFullNSname as NSname 相同 use MyFullNSname; // 導(dǎo)入一個全局類 use ArrayObject; // 導(dǎo)入一個函數(shù) use function MyFullfunctionName; // 導(dǎo)入一個函數(shù)并定義別名 use function MyFullfunctionName as func; // 導(dǎo)入一個常量 use const MyFullCONSTANT; $obj = new namespaceAnother; // 實例化 fooAnother 對象 $obj = new Another; // 實例化 MyFullClassname 對象 NSnamesubnsfunc(); // 調(diào)用 MyFullNSnamesubnsfunc 函數(shù) $a = new ArrayObject(array(1)); // 實例化 ArrayObject 對象 // 如果不使用 "use ArrayObject" ,則實例化一個 fooArrayObject 對象 func(); // 調(diào)用 MyFullfunctionName 函數(shù) echo CONSTANT; // 打印 MyFullCONSTANT 常量 ?>
注意:對命名空間中的名稱(包含命名空間分隔符的完全限定名稱,如 FooBar ,以及相對的不包含命名空間分隔符的全局名稱,如 FooBar)來說,前導(dǎo)的反斜杠是不必要的也是不推薦的,因為導(dǎo)入的名稱必須是完全限定的,不會根據(jù)當(dāng)前的命名空間作相對解析。
為了簡化操作,PHP 還支持在一行中導(dǎo)入多個命名空間,中間使用,隔開,示例代碼如下:
<?php use MyFullClassname as Another, MyFullNSname; $obj = new Another; // 實例化 MyFullClassname 對象 NSnamesubnsfunc(); // 調(diào)用 MyFullNSnamesubnsfunc 函數(shù) ?>
導(dǎo)入操作是編譯執(zhí)行的,但動態(tài)的類名稱、函數(shù)名稱或常量名稱則不是。
<?php use MyFullClassname as Another, MyFullNSname; $obj = new Another; // 實例化一個 MyFullClassname 對象 $a = 'Another'; $obj = new $a; // 實際化一個 Another 對象 ?>
另外,導(dǎo)入操作只影響非限定名稱和限定名稱。完全限定名稱由于是確定的,故不受導(dǎo)入的影響。
推薦學(xué)習(xí):《PHP視頻教程》