PHP基礎(chǔ)之命名空間3——命名空間使用基礎(chǔ)
在討論如何使用命名空間之前,必須了解 PHP 是如何知道要使用哪一個(gè)命名空間中的元素的。可以將 PHP 命名空間與文件系統(tǒng)作一個(gè)簡(jiǎn)單的類(lèi)比。在文件系統(tǒng)中訪(fǎng)問(wèn)一個(gè)文件有三種方式:
相對(duì)文件名形式如foo.txt。它會(huì)被解析為?currentdirectory/foo.txt,其中 currentdirectory 表示當(dāng)前目錄。因此如果當(dāng)前目錄是?/home/foo,則該文件名被解析為/home/foo/foo.txt。相對(duì)路徑名形式如subdirectory/foo.txt。它會(huì)被解析為?currentdirectory/subdirectory/foo.txt。絕對(duì)路徑名形式如/main/foo.txt。它會(huì)被解析為/main/foo.txt。PHP 命名空間中的元素使用同樣的原理。例如,類(lèi)名可以通過(guò)三種方式引用:
非限定名稱(chēng),或不包含前綴的類(lèi)名稱(chēng),例如?$a=new foo();?或?foo::staticmethod();。如果當(dāng)前命名空間是?currentnamespace,foo 將被解析為currentnamespacefoo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會(huì)被解析為foo。?警告:如果命名空間中的函數(shù)或常量未定義,則該非限定的函數(shù)名稱(chēng)或常量名稱(chēng)會(huì)被解析為全局函數(shù)名稱(chēng)或常量名稱(chēng)。限定名稱(chēng),或包含前綴的名稱(chēng),例如?$a = new subnamespacefoo();?或?subnamespacefoo::staticmethod();。如果當(dāng)前的命名空間是?currentnamespace,則 foo 會(huì)被解析為?currentnamespacesubnamespacefoo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會(huì)被解析為subnamespacefoo。完全限定名稱(chēng),或包含了全局前綴操作符的名稱(chēng),例如,?$a = new currentnamespacefoo();?或?currentnamespacefoo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespacefoo。下面是一個(gè)使用這三種方式的實(shí)例:
file1.php:
<?php namespace FooBarsubnamespace; const FOO = 1; function foo() {} class foo {static function staticmethod() {} }?>
file2.php:
<?php namespace FooBar; include ’file1.php’; const FOO = 2; function foo() {} class foo {static function staticmethod() {} } /* 非限定名稱(chēng) */ foo(); // 解析為 FooBarfoo resolves to function FooBarfoo foo::staticmethod(); // 解析為類(lèi) FooBarfoo的靜態(tài)方法staticmethod。 echo FOO; // resolves to constant FooBarFOO /* 限定名稱(chēng) */ subnamespacefoo(); // 解析為函數(shù) FooBarsubnamespacefoo subnamespacefoo::staticmethod(); // 解析為類(lèi) FooBarsubnamespacefoo,以及類(lèi)的方法 staticmethod echo subnamespaceFOO; // 解析為常量 FooBarsubnamespaceFOO /* 完全限定名稱(chēng) */ FooBarfoo(); // 解析為函數(shù) FooBarfoo FooBarfoo::staticmethod(); // 解析為類(lèi) FooBarfoo, 以及類(lèi)的方法 staticmethod echo FooBarFOO; // 解析為常量 FooBarFOO?>
注意訪(fǎng)問(wèn)任意全局類(lèi)、函數(shù)或常量,都可以使用完全限定名稱(chēng),例如?strlen()?或?Exception?或?INI_ALL。
Example #1 在命名空間內(nèi)部訪(fǎng)問(wèn)全局類(lèi)、函數(shù)和常量
<?php namespace Foo; function strlen() {} const INI_ALL = 3; class Exception {} $a = strlen(’hi’); // 調(diào)用全局函數(shù)strlen $b = INI_ALL; // 訪(fǎng)問(wèn)全局常量 INI_ALL $c = new Exception(’error’); // 實(shí)例化全局類(lèi) Exception?>
相關(guān)文章:
1. python實(shí)現(xiàn)讀取類(lèi)別頻數(shù)數(shù)據(jù)畫(huà)水平條形圖案例2. Java 基于UDP協(xié)議實(shí)現(xiàn)消息發(fā)送3. python 如何停止一個(gè)死循環(huán)的線(xiàn)程4. ASP.NET MVC前臺(tái)動(dòng)態(tài)添加文本框并在后臺(tái)使用FormCollection接收值5. php5.6不能擴(kuò)展redis.so的解決方法6. PHP獲取時(shí)間戳等相關(guān)函數(shù)匯總7. 關(guān)于HTML5的img標(biāo)簽8. Python編寫(xiě)nmap掃描工具9. python 爬取嗶哩嗶哩up主信息和投稿視頻10. 如何基于python3和Vue實(shí)現(xiàn)AES數(shù)據(jù)加密
