本文主要跟大家介紹了關(guān)于PHP新特性之命名空間、性狀與生成器的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面來一起看看詳細(xì)的介紹:
1.命名空間
命名空間是什么?
1).命名空間在PHP 5.3中被引入,類似于文件夾的功能。例如Symfony框架中的Request和Response,位于Symfony的命名空間下。
2).命名空間始終應(yīng)該在<?php標(biāo)簽的下面一行。
3).PHP文件的命名空間和操作系統(tǒng)的物理文件系統(tǒng)不同,這是一個虛擬的概念,沒有必要和文件系統(tǒng)的目錄結(jié)構(gòu)完全對應(yīng)。雖然如此,絕大多數(shù)PHP組件為了兼容廣泛使用的PSR4自動加載標(biāo)準(zhǔn),會把子命名空間放到文件系統(tǒng)的子目錄中去。
4).命名空間只是PHP語言的一種記號,PHP解釋器會將這種記號作為前綴添加到類、接口、函數(shù)和常量的名稱前面。
為什么需要命名空間?
1).命名空間使得程序可以像沙盒一樣運(yùn)行,可以和其他開發(fā)者編寫的代碼一起使用。確保了自己的代碼和項(xiàng)目可以和項(xiàng)目的第三方依賴一起使用。
聲明命名空間
1).頂層命名空間經(jīng)常用于設(shè)定頂層廠商名。2).廠商的命名空間必須具有全局唯一性,子命名空間就沒有那么重要,但有助于組織項(xiàng)目的代碼。
導(dǎo)入和別名
1).從PHP5.3開始可以導(dǎo)入PHP類、接口和其他命名空間,并為其創(chuàng)建別名。從PHP5.6開始可以導(dǎo)入PHP函數(shù)和常量,并為其創(chuàng)建別名。
2).使用use關(guān)鍵字導(dǎo)入代碼時無須在開頭加上符號,因?yàn)镻HP假定導(dǎo)入的是完全限定命名空間。use關(guān)鍵字必須出現(xiàn)在全局作用域中即不能出現(xiàn)在類或者函數(shù)中,因?yàn)檫@個關(guān)鍵字是在編譯的時候使用的,不過,use關(guān)鍵字可以在命名空間聲明語句后使用,導(dǎo)入其他命名空間的代碼。
從PHP5.6開始我們可以導(dǎo)入函數(shù)和常量。
<?php use func Namespace\functionName; functionName();
也可以導(dǎo)入常量,
use constant Namespace\CONS_NAME; echo CONS_NAME;
函數(shù)和常量的別名與類名的創(chuàng)建方式一樣。
最佳實(shí)踐
1).PHP允許在一個PHP文件中定義多個命名空間。但是這么做容易讓人困惑,違背了一個文件一個類的良好實(shí)踐。2).在一個命名空間中引用全局的命名空間的代碼時,需要加上前綴,告訴PHP需要在全局中查找該類,例如PHP原生的異常類。
自動加載
1).命名空間為PHP-FIG制定的PSR4自動加載器奠定了堅(jiān)實(shí)的基礎(chǔ)。
2.使用接口
1).就像我可以選擇開不一樣的車。因?yàn)樗麄兌加蟹较虮P、油門和剎車,并且燃料都是汽油。
3.性狀
1).形狀是類的部分實(shí)現(xiàn)(常量、屬性和方法),可以混入一個或者多個現(xiàn)有的PHP類中,性狀有兩個作用,表明類可以做什么(類似接口),提供模塊化實(shí)踐(類似類)。
2).性狀使得兩個無關(guān)的類可以使用相同屬性和方法。
3).PHP解釋器會把性狀復(fù)制粘貼到類的定義體中。
4.創(chuàng)建生成器
1)在普通函數(shù)中一次或者多次使用yield關(guān)鍵字,不返回值,只生成值,這個函數(shù)就是一個生成器。例如:
<?php function myGenerator() { yield 'value1'; yield 'value2'; }
調(diào)用生成器函數(shù)的時候,PHP會返回一個屬于Generator類的對象,這個對象可以使用foreach()函數(shù)迭代,每次迭代,PHP會要求這個對象的實(shí)例計(jì)算并提供下一個要迭代的值,生成器的優(yōu)雅之處就是在每產(chǎn)出一個值之后,生成器內(nèi)部狀態(tài)會一直停頓和恢復(fù)之間切換,直到抵達(dá)定義體的末尾或者遇到空的return;語句為止,例如:
<?php foreach (myGenerator() as $yieldedValue) { echo $yieldedValue, PHP_EOL; }
以上例子會輸出
value1 value2
2).生成器是如何節(jié)約內(nèi)存的?生成一個范圍內(nèi)的數(shù)值(錯誤方式)
function makeRange($length) { $dataset = []; for ($i=0; $i < $length; $i++) { $dataset[] = $i; } return $dataset; } $customRange = makeRange(1000000); foreach ($customeRange as $i) { echo $i, PHP_EOL; }