一、簡(jiǎn)介
PHP允許通過(guò)別名引用或?qū)胪獠康耐耆薅Q,這有點(diǎn)類似于在類 unix 文件系統(tǒng)中可以創(chuàng)建對(duì)其它的文件或目錄的符號(hào)連接??梢詭椭覀儽苊庠诖a中使用冗長(zhǎng)的全名,從而提高代碼的可讀性和可維護(hù)性。別名是通過(guò)操作符 use 來(lái)實(shí)現(xiàn)的,本教程將介紹五種導(dǎo)入方式的例子。
PHP 可以為這些項(xiàng)目導(dǎo)入或設(shè)置別名:
- 常量
- 函數(shù)
- 類
- 接口
- trait
- 枚舉
- 命名空間
別名是通過(guò)操作符 use 來(lái)實(shí)現(xiàn)的,下面是五種導(dǎo)入方式的例子。
二、use操作符
<?php namespace?foo; use?My\Full\Classname?as?Another; //?下面的例子與?use?My\Full\NSname?as?NSname?相同 use?My\Full\NSname; //?導(dǎo)入一個(gè)全局類 use?ArrayObject; //?導(dǎo)入函數(shù) use?function?My\Full\functionName; //?為函數(shù)設(shè)置別名 use?function?My\Full\functionName?as?func; //?導(dǎo)入常量 use?const?My\Full\CONSTANT; $obj?=?new?namespace\Another;?//?實(shí)例化?foo\Another?對(duì)象 $obj?=?new?Another;?//?實(shí)例化?My\Full\Classname 對(duì)象 NSname\subns\func();?//?調(diào)用函數(shù)?My\Full\NSname\subns\func $a?=?new?ArrayObject(array(1));?//?實(shí)例化?ArrayObject?對(duì)象 //?如果不使用?"use?\ArrayObject"?,則實(shí)例化一個(gè)?foo\ArrayObject?對(duì)象 func();?//?調(diào)用函數(shù)?My\Full\functionName echo?CONSTANT;?//?輸出?My\Full\CONSTANT?的值 ?>
注意對(duì)命名空間中的名稱(包含命名空間分隔符的完全限定名稱如 Foo\Bar 以及相對(duì)的不包含命名空間分隔符的全局名稱如 FooBar)來(lái)說(shuō),前導(dǎo)的反斜杠是不必要的也不推薦的,因?yàn)閷?dǎo)入的名稱必須是完全限定的,不會(huì)根據(jù)當(dāng)前的命名空間作相對(duì)解析。
為了簡(jiǎn)化操作,PHP 還支持在一行中使用多個(gè) use 語(yǔ)句。通過(guò) use 操作符導(dǎo)入/使用別名,一行中包含多個(gè) use 語(yǔ)句:
<?php use?My\Full\Classname?as?Another,?My\Full\NSname; $obj?=?new?Another;?//?實(shí)例化?My\Full\Classname?對(duì)象 NSname\subns\func();?//?調(diào)用函數(shù)?My\Full\NSname\subns\func ?>
導(dǎo)入操作是在編譯執(zhí)行的,但動(dòng)態(tài)的類名稱、函數(shù)名稱或常量名稱則不是。
三、導(dǎo)入和動(dòng)態(tài)名稱
<?php use?My\Full\Classname?as?Another,?My\Full\NSname; $obj?=?new?Another;?//?實(shí)例化一個(gè)?My\Full\Classname?對(duì)象 $a?=?'Another'; $obj?=?new?$a;??????//?實(shí)際化一個(gè)?Another?對(duì)象 ?>
另外,導(dǎo)入操作只影響非限定名稱和限定名稱。完全限定名稱由于是確定的,故不受導(dǎo)入的影響。
四、導(dǎo)入和完全限定名稱
<?php use?My\Full\Classname?as?Another,?My\Full\NSname; $obj?=?new?Another;?//?class?My\Full\Classname?的實(shí)例對(duì)象 $obj?=?new?\Another;?//?class?Another?的實(shí)例對(duì)象 $obj?=?new?Another\thing;?//?class?My\Full\Classname\thing?的實(shí)例對(duì)象 $obj?=?new?\Another\thing;?//?class?Another\thing?的實(shí)例對(duì)象 ?>
五、導(dǎo)入規(guī)則的范圍
use 關(guān)鍵詞必須在文件最外層范圍 (全局作用域)或在命名空間聲明內(nèi)。 由于導(dǎo)入發(fā)生在編譯時(shí),而不是運(yùn)行時(shí),所以不能放入塊作用域。 以下例子展示了不合規(guī)則的 use 關(guān)鍵詞使用示例:
1、不合規(guī)的導(dǎo)入規(guī)則
<?php namespace?Languages; function?toGreenlandic() { ????use?Languages\Danish; ????//?... } ?>
注意:導(dǎo)入規(guī)則獨(dú)立于每個(gè)文件,意味著包含的文件 不會(huì)繼承父文件的導(dǎo)入規(guī)則。
2、use聲明編組
通過(guò)單個(gè) use 語(yǔ)句,可以將來(lái)自同一個(gè) namespace 的 類、函數(shù)、常量一起編組導(dǎo)入。
<?php use?some\namespace\ClassA; use?some\namespace\ClassB; use?some\namespace\ClassC?as?C; use?function?some\namespace\fn_a; use?function?some\namespace\fn_b; use?function?some\namespace\fn_c; use?const?some\namespace\ConstA; use?const?some\namespace\ConstB; use?const?some\namespace\ConstC; //?等同于以下編組的?use?聲明 use?some\namespace\{ClassA,?ClassB,?ClassC?as?C}; use?function?some\namespace\{fn_a,?fn_b,?fn_c}; use?const?some\namespace\{ConstA,?ConstB,?ConstC};