摘要:在實(shí)際的例如迭代一個(gè)大小的文件中功能中,迭代器大展身手。函數(shù)檢測(cè)是否到達(dá)文件末尾一次讀取文件的一行生成器沒有為添加新功能,需要實(shí)現(xiàn)在數(shù)據(jù)集中執(zhí)行快進(jìn)快退和查找,最好自己編寫類實(shí)現(xiàn)接口,或者使用標(biāo)準(zhǔn)庫中的某個(gè)原生迭代器。
1.命名空間
1).命名空間在PHP 5.3中被引入,類似于文件夾的功能。例如Symfony框架中的Request和Response,位于Symfony的命名空間下。
2).命名空間始終應(yīng)該在3).PHP文件的命名空間和操作系統(tǒng)的物理文件系統(tǒng)不同,這是一個(gè)虛擬的概念,沒有必要和文件系統(tǒng)的目錄結(jié)構(gòu)完全對(duì)應(yīng)。雖然如此,絕大多數(shù)PHP組件為了兼容廣泛使用的PSR4自動(dòng)加載標(biāo)準(zhǔn),會(huì)把子命名空間放到文件系統(tǒng)的子目錄中去。
4).命名空間只是PHP語言的一種記號(hào),PHP解釋器會(huì)將這種記號(hào)作為前綴添加到類、接口、函數(shù)和常量的名稱前面。
1).命名空間使得程序可以像沙盒一樣運(yùn)行,可以和其他開發(fā)者編寫的代碼一起使用。確保了自己的代碼和項(xiàng)目可以和項(xiàng)目的第三方依賴一起使用。
1).頂層命名空間經(jīng)常用于設(shè)定頂層廠商名。
2).廠商的命名空間必須具有全局唯一性,子命名空間就沒有那么重要,但有助于組織項(xiàng)目的代碼。
1).從PHP5.3開始可以導(dǎo)入PHP類、接口和其他命名空間,并為其創(chuàng)建別名。從PHP5.6開始可以導(dǎo)入PHP函數(shù)和常量,并為其創(chuàng)建別名。
2).使用use關(guān)鍵字導(dǎo)入代碼時(shí)無須在開頭加上符號(hào),因?yàn)镻HP假定導(dǎo)入的是完全限定命名空間。use關(guān)鍵字必須出現(xiàn)在全局作用域中即不能出現(xiàn)在類或者函數(shù)中,因?yàn)檫@個(gè)關(guān)鍵字是在編譯的時(shí)候使用的,不過,use關(guān)鍵字可以在命名空間聲明語句后使用,導(dǎo)入其他命名空間的代碼。
從PHP5.6開始我們可以導(dǎo)入函數(shù)和常量。
也可以導(dǎo)入常量,
use constant NamespaceCONS_NAME; echo CONS_NAME;函數(shù)和常量的別名與類名的創(chuàng)建方式一樣。
最佳實(shí)踐
1).PHP允許在一個(gè)PHP文件中定義多個(gè)命名空間。但是這么做容易讓人困惑,違背了一個(gè)文件一個(gè)類的良好實(shí)踐。
2).在一個(gè)命名空間中引用全局的命名空間的代碼時(shí),需要加上前綴,告訴PHP需要在全局中查找該類,例如PHP原生的異常類。自動(dòng)加載
1).命名空間為PHP-FIG制定的PSR4自動(dòng)加載器奠定了堅(jiān)實(shí)的基礎(chǔ)。
2.使用接口1).就像我可以選擇開不一樣的車。因?yàn)樗麄兌加蟹较虮P、油門和剎車,并且燃料都是汽油。
3.性狀1).形狀是類的部分實(shí)現(xiàn)(常量、屬性和方法),可以混入一個(gè)或者多個(gè)現(xiàn)有的PHP類中,性狀有兩個(gè)作用,表明類可以做什么(類似接口),提供模塊化實(shí)踐(類似類)。
4.創(chuàng)建生成器
2).性狀使得兩個(gè)無關(guān)的類可以使用相同屬性和方法。
3).PHP解釋器會(huì)把性狀復(fù)制粘貼到類的定義體中。1)在普通函數(shù)中一次或者多次使用yield關(guān)鍵字,不返回值,只生成值,這個(gè)函數(shù)就是一個(gè)生成器。例如:
調(diào)用生成器函數(shù)的時(shí)候,PHP會(huì)返回一個(gè)屬于Generator類的對(duì)象,這個(gè)對(duì)象可以使用foreach()函數(shù)迭代,每次迭代,PHP會(huì)要求這個(gè)對(duì)象的實(shí)例計(jì)算并提供下一個(gè)要迭代的值,生成器的優(yōu)雅之處就是在每產(chǎn)出一個(gè)值之后,生成器內(nèi)部狀態(tài)會(huì)一直停頓和恢復(fù)之間切換,直到抵達(dá)定義體的末尾或者遇到空的return;語句為止,例如:
以上例子會(huì)輸出
value1 value22).生成器是如何節(jié)約內(nèi)存的?生成一個(gè)范圍內(nèi)的數(shù)值(錯(cuò)誤方式)
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; }預(yù)先創(chuàng)建了一個(gè)包含很大整數(shù)組成的數(shù)組,再看使用生成器的例子。
function makeRange($length) { for ($i = 0; $i < $length; $i++) { yield $i; } } foreach(makeRange(1000000) as $i) { echo $i, PHP_EOL; }在實(shí)際的例如迭代一個(gè)4GB大小的文件中功能中,迭代器大展身手。
function getRows($file) { $handle = fopen($file, "rb"); if ($handle === false) { throw new Exception(); } //feof()函數(shù)檢測(cè)是否到達(dá)文件末尾 while (feof($handle) === false) { //fgetcsv()一次讀取csv文件的一行 yield fgetcsv($handle); } fclose($handle) } foreach (getRows("data.csv") as $row) { print_r($row); }3).生成器沒有為PHP添加新功能,需要實(shí)現(xiàn)在數(shù)據(jù)集中執(zhí)行快進(jìn)、快退和查找,最好自己編寫類實(shí)現(xiàn)Iterator接口,或者使用PHP標(biāo)準(zhǔn)庫中的某個(gè)原生迭代器。
專題系列
原生迭代器鏈接PHP專題系列目錄地址:https://github.com/xx19941215/webBlog
PHP專題系列預(yù)計(jì)寫二十篇左右,主要總結(jié)我們?nèi)粘HP開發(fā)中容易忽略的基礎(chǔ)知識(shí)和現(xiàn)代PHP開發(fā)中關(guān)于規(guī)范、部署、優(yōu)化的一些實(shí)戰(zhàn)性建議,同時(shí)還有對(duì)Javascript語言特點(diǎn)的深入研究。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/23261.html
摘要:的使命是實(shí)現(xiàn)框架之間的互操作性。個(gè)人和官方都認(rèn)為開發(fā)者應(yīng)該遵循更為嚴(yán)格的代碼標(biāo)準(zhǔn),在現(xiàn)代的生態(tài)系統(tǒng)中,風(fēng)格統(tǒng)一,可以更好的讓其他開發(fā)者理解代碼。記錄的消息用于診斷檢查和排除應(yīng)用中的操作穩(wěn)定性和性能方面的問題。 原文是在我自己博客中,小伙伴也可以點(diǎn)閱讀原文進(jìn)行跳轉(zhuǎn)查看,還有好聽的背景音樂噢~ ????PSR是PHP Standards Recommendation的簡(jiǎn)稱,意為PHP推薦標(biāo)...
摘要:審視現(xiàn)在現(xiàn)在,語言發(fā)展迅速,由來自全球的幾十名核心開發(fā)者提供支持,而且開發(fā)方式也發(fā)生了變化。這些改進(jìn)得益于新競(jìng)爭(zhēng)者的出現(xiàn),尤其是開發(fā)的和。簡(jiǎn)稱是和的解釋器,使用即時(shí)編譯器提升應(yīng)用的性能,并減少內(nèi)存用量。對(duì)于程序員來說,現(xiàn)在是令人激動(dòng)的時(shí)刻。 就目前PHP語言的發(fā)展可以說是蒸蒸日上的,這得益于命名空間、性狀、閉包和內(nèi)置的操作碼緩存等有用的特性,所以PHP正在變成一門現(xiàn)代化腳本語言,并且現(xiàn)...
摘要:很多開發(fā)朋友都沒有弄清楚性狀。性狀有兩個(gè)作用表明類可以做什么像是接口提供模塊化實(shí)現(xiàn)像是類。注是不要自我重復(fù)的簡(jiǎn)稱,表示不要在多個(gè)地方重復(fù)編寫相同的代碼,如果需要修改遵守這個(gè)原則編寫的代碼,只需要在一出修改,改動(dòng)就能體現(xiàn)到其他地方。 很多PHP開發(fā)朋友都沒有弄清楚Trait(性狀)。這是PHP5.4.0引入的新概念,既像類又像接口。性狀是類的補(bǔ)分實(shí)現(xiàn)(即常量、屬性、方法),可以混入一個(gè)...
摘要:從這個(gè)例子中,我們可以看出至少要做三件事情根據(jù)類名確定類文件名確定類文件所在的磁盤路徑將類從磁盤文件中加載到系統(tǒng)中。 深入解析 composer 的自動(dòng)加載原理 前言 PHP 自5.3的版本之后,已經(jīng)重?zé)ㄐ律臻g、性狀(trait)、閉包、接口、PSR 規(guī)范、以及 composer 的出現(xiàn)已經(jīng)讓 PHP 變成了一門現(xiàn)代化的腳本語言。PHP 的生態(tài)系統(tǒng)也一直在演進(jìn),而 compos...
摘要:需求場(chǎng)景發(fā)送驗(yàn)證碼或者消息通知,可發(fā)送到手機(jī)或郵箱中。完成首先,在中的規(guī)范就是使用的消息通知,這里基于場(chǎng)景為驗(yàn)證碼。所以我們?cè)隍?yàn)證碼模型中添加是完全符合通知的正確使用的。 順便發(fā)個(gè)小通知:7月15日ThinkSNS+開源版發(fā)布,同時(shí)非開源的APP也走出內(nèi)測(cè)階段,體驗(yàn)二維碼也全面發(fā)布體驗(yàn)。 什么是ThinkSNS ? ThinkSNS(簡(jiǎn)稱TS),一款全平臺(tái)綜合性社交系統(tǒng),為國內(nèi)外大中小...
閱讀 2433·2023-04-26 00:46
閱讀 594·2023-04-25 21:36
閱讀 738·2021-11-24 10:19
閱讀 2283·2021-11-23 09:51
閱讀 1029·2021-10-21 09:39
閱讀 842·2021-09-22 10:02
閱讀 1677·2021-09-03 10:29
閱讀 2709·2019-08-30 15:53