今天帶來的依然是命名空間相關的內容,本身命名空間就是PHP中非常重要的一個特性,所以關于它的各種操作和使用還是非常復雜的,光使用方式就有很多種,我們一個一個的來看,
子命名空間
命名空間本身就像目錄一樣,所以命名空間當然也是可以定義子命名空間的,真的就和作業系統的各種目錄層級是完全一樣的,我們通過簡單的例子來看看,首先還是創建三個php檔案,其中3-2和3-2-1是使用的相同的二級命名空間,3-2-1在FILE32的基礎上繼續向下擴展了第三級的命名空間FILE321,他們都是MyProject命名空間的子命名空間,
// file3-1.php
namespace MyProject\FILE31;
function testA31(){
echo 'FILE31\testA()', PHP_EOL;
}
// file3-2.php
namespace MyProject\FILE32;
const CONST_A32 = "file3-2";
function testA32(){
echo 'FILE32\testA()', PHP_EOL;
}
class objectA32{
function test(){
echo 'FILE32\ObjectA', PHP_EOL;
}
}
// file3-2-1.php
namespace MyProject\FILE32\FILE321;
function testA321(){
echo 'FILE321\testA()', PHP_EOL;
}
接下來的使用就很簡單了,和使用一級命名空間一樣,直接使用use進行匯入就可以了,
// 子命名空間
require 'namespace/file3-1.php';
require 'namespace/file3-2.php';
require 'namespace/file3-2-1.php';
use MyProject\FILE31;
use MyProject\FILE32;
use MyProject\FILE32\FILE321;
FILE31\testA31(); // FILE31\testA()
FILE32\testA32(); // FILE32\testA()
FILE32\FILE321\testA321(); // FILE321\testA()
FILE321\testA321(); // FILE321\testA()
同一檔案中定義多個命名空間
PHP是允許在一個檔案中定義多個命名空間的,但是并不推薦這么做,因為這樣可能會帶來各種未知的混亂,在這里,我們只要了解到可以這樣使用就行了,在日常的開發中還是盡量要避免,
// file4.php
namespace FILE41;
function testA41(){
echo 'FILE41\testA()', PHP_EOL;
}
namespace FILE42;
function testA42(){
echo 'FILE42\testA()', PHP_EOL;
}
在使用中當然也和其他命名空間的使用沒什么兩樣,直接use使用即可,
// 一個檔案中多個命名空間
require 'namespace/file4.php';
use FILE41, FILE42;
FILE41\testA41(); // FILE41\testA()
FILE42\testA42(); // FILE42\testA()
非限定名稱、限定名稱、完全限定名稱
不要被術語嚇到,這三個術語其實非常好理解,
- 非限定名稱,名稱中不包含命名空間分隔符的識別符號,例如 Foo ,
- 限定名稱,名稱中含有命名空間分隔符的識別符號,例如 Foo\Bar ,
- 名稱中包含命名空間分隔符,并以命名空間分隔符開始的識別符號,例如 \Foo\Bar, namespace\Foo 也是一個完全限定名稱,
直接用例子來說就非常清晰了,
// 非限定名稱、限定名稱、完全限定名稱
use MyProject\FILE32\objectA32 as obj32;
$o = new obj32(); // 非限定名稱
$o->test(); // FILE32\ObjectA
$o = new FILE32\objectA32(); // 限定名稱
$o->test(); // FILE32\ObjectA
$o = new \MyProject\FILE32\objectA32(); // 完全限定名稱
$o->test(); // FILE32\ObjectA
namespace關鍵字和__NAMESPACE__常量
- namesapce,顯式訪問當前命名空間或子命名空間中的元素,它等價于類中的 self 運算子,
- NAMESPACE,包含當前命名空間名稱的字串,在全域的,不包括在任何命名空間中的代碼,它包含一個空的字串,
也是很簡單的內容吧,直接來看例子,
// file5.php
namespace FILE5;
function test(){
echo __NAMESPACE__ . ': test()', PHP_EOL;
}
// test.php
namespace Pro;
// namespace與__NAMESPACE__
require 'namespace/file5.php';
function test(){
echo __NAMESPACE__ . ': test()', PHP_EOL;
}
namespace\test(); // Pro: test()
\FILE5\test(); // FILE5: test()
我們給當前命名空間定義為Pro,引入了file5檔案,這兩個檔案中都有一個test()方法,test()方法內都輸出了__NAMESPACE__來列印當前的命名空間名稱,然后在test.php中,通過namespace關鍵字呼叫的就是當前檔案的Pro命名空間中的test()方法,輸出的是 Pro: test() ,直接使用完全限定名稱呼叫FILE5的test()方法,輸出了 FILE5: test() ,
測驗代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202001/source/PHP%E4%B8%AD%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E6%98%AF%E6%80%8E%E6%A0%B7%E7%9A%84%E5%AD%98%E5%9C%A8%EF%BC%9F%EF%BC%88%E4%BA%8C%EF%BC%89%20.php
參考檔案:
https://www.php.net/manual/zh/language.namespaces.nsconstants.php
https://www.php.net/manual/zh/language.namespaces.rules.php
https://www.php.net/manual/zh/language.namespaces.nested.php
https://www.php.net/manual/zh/language.namespaces.definitionmultiple.php
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266218.html
標籤:PHP
