一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - Yii框架中使用PHPExcel的方法分析

Yii框架中使用PHPExcel的方法分析

2021-08-11 16:19zhaozhi406 PHP教程

這篇文章主要介紹了Yii框架中使用PHPExcel的方法,簡單分析了Yii使用PHPExcel的相關(guān)操作技巧與注意事項(xiàng),并附帶說明了Yii的autoload機(jī)制,需要的朋友可以參考下

本文實(shí)例分析了Yii框架中使用PHPExcel的方法。分享給大家供大家參考,具體如下:

PHPExcel是一個(gè)比較好用的php讀取excel文件的類庫,今天遇到了在yii中如何加載PHPExcel類文件的問題,因?yàn)閅ii的autoload機(jī)制是安裝類名去找文件,即文件名就是相應(yīng)的類名,而PHPExcel的類文件命名方式則是:dir_dir_classname.php,即文件名把文件的目錄名都記錄了,這種命名方式y(tǒng)ii肯定識(shí)別不了。怎么辦?

其實(shí)PHPExcel也有自己的autoload方法(PHPExcel_Autoloader::load() ),通過查看源碼發(fā)現(xiàn)它也是通過spl_autoload_register函數(shù)注冊(cè)的(在PHPExcel_Autoloader::register() 中),而我們知道PHP的autoload機(jī)制是,所有用spl_autoload_register函數(shù)注冊(cè)的方法,都會(huì)在autoload時(shí)被spl_autoload_call函數(shù)執(zhí)行一遍,因此我們只需要讓PHPExcel的autoload方法順利注冊(cè)上就行了。

如果了解Yii的autoload機(jī)制,不清楚的可以看 附錄 Yii的autoload機(jī)制 ,可以知道,只要設(shè)置Yii::$enableIncludePathfalse,第三方類庫就有了執(zhí)行自己的autoload方法的機(jī)會(huì),然后使用下面兩行代碼就能加載PHPExcel的類了:

?
1
2
Yii::$enableIncludePath = false;
Yii::import('application.vendors.phpexcel.PHPExcel', 1);

import時(shí)采用了force include的方式,這是因?yàn)镻HPExcel.php在被require時(shí)才會(huì)注冊(cè)autoloader,如果等到new PHPExcel時(shí)才注冊(cè),其他的類例如PHPExcel_IOFactory如果在這之前使用了,就會(huì)出現(xiàn)找不到類的錯(cuò)誤。

個(gè)人認(rèn)為我的這種辦法是比較方便且優(yōu)雅的,對(duì)比網(wǎng)上的其他辦法好很多,下面列舉的辦法都或多或少有點(diǎn)問題,例如:

1、http://www.ythuaji.com.cn/article/182760.html,這種辦法先將Yii自己的autoloader unregister了,會(huì)造成yii自己的類加載不上

2、http://www.ythuaji.com.cn/article/182761.html,這種辦法還修改了PHPExcel的autoloader,代價(jià)很大。

附錄: Yii的autoload機(jī)制

Yii框架宣稱自己的類加載方式很高效,是真正的“用時(shí)加載”,那究竟特別在哪里?今天研究了一下源碼,發(fā)現(xiàn)其實(shí)是在代碼級(jí)加了一層“路徑緩存”。

我們知道,要實(shí)現(xiàn)自己的autoload方法,需要采用spl_autoload_register()函數(shù)注冊(cè)一個(gè)autoload方法,Yii注冊(cè)的這個(gè)方法是YiiBase::autoload(),稍后再講解這個(gè)方法的邏輯。另外,Yii一般都用Yii::import($pathAlias, $forceInclude=false)來加載相應(yīng)的類(這個(gè)方法直接調(diào)用了YiiBase::import() ),這個(gè)方法配合YiiBase::autoload()就能實(shí)現(xiàn)“用時(shí)加載”了。

先說import的大致邏輯:

1、檢查self::$_imports數(shù)組是否存在相應(yīng)的$pathAlias,如果有說明已經(jīng)加載過了,直接返回類名或者目錄名;否則繼續(xù)第2步;

2、根據(jù)路徑別名獲得實(shí)際的路徑名,并根據(jù)路徑別名最后一部分是否是“*”可以知道要加載的路徑別名是否是一個(gè)文件,如果是文件,去第3步;否則去第4步;

3、如果是$forceInclude是true,則立即require這個(gè)文件,并在$_imports數(shù)組中增加一項(xiàng)$alias => $className;否則在數(shù)組$classMap中緩存一項(xiàng)$className => $realPath

4、對(duì)于路徑,會(huì)在數(shù)組$_includePaths中緩存這個(gè)路徑,并且在$_imports數(shù)組中增加一項(xiàng)$alias => $realPath

5、結(jié)束。

因?yàn)?forceInclude默認(rèn)都為false,所以import不會(huì)立即加載相應(yīng)的類,等到使用時(shí)才真正加載,這是YiiBase::autoload的工作。

autoload的大致邏輯:

1、檢查類名是否已緩存在$classMap或$_coreClasses數(shù)組中,如果是則直接require相應(yīng)的文件路徑,$_coreClasses是框架自有類的映射表;否則去第2步;

2、檢測YiiBase::$enableIncludePath是否為false,如果是則去第3步,否則直接include($className . '.php')

3、遍歷$includePaths數(shù)組,將目錄名拼接上類名,檢查是否為合法的php文件,如果是則include,然后跳出循環(huán)

4、結(jié)束。

需要注意的是,文檔指出:如果要與其他類庫一起使用,必須將$enableIncludePath置為false,以便在Yii::autoload()失敗時(shí),其他類庫的autoload方法有機(jī)會(huì)執(zhí)行。

希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。

原文鏈接:https://blog.csdn.net/zhaozhi406/article/details/9325835

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 啾咪成人漫画免费 | 人人爽人人草 | va在线视频 | 无码人妻视频又大又粗欧美 | 女人麻豆国产香蕉久久精品 | bl高h荡肉古代np | zozo日本另类极品 | 国产伦精品一区二区三区免费迷 | 亚洲va韩国va欧美va天堂 | 久久青草免费91线频观看站街 | 亚洲 欧美 中文 日韩 视频 | 亚洲香蕉伊在人在线观婷婷 | 魔法满屋免费观看完整版中文 | 欧美有码| 91夜夜人人揉人人捏人人添 | 日韩一区二区三 | 国产精品露脸国语对白河北 | 日产一区二区 | 美女被免费视频 | 喜欢老头吃我奶躁我的动图 | 操好爽 | 成人精品一区二区三区 | 国产午夜久久精品 | 成人综合婷婷国产精品久久免费 | 99rv精品视频在线播放 | 亚洲一区二区三区福利在线 | 水多多www视频在线观看高清 | 色操网| 国产精品久久久久久久久久久搜索 | 亚洲一区二区福利视频 | 91国内精品线免费播放 | 日本又黄又裸一级大黄裸片 | 91精品国产综合久久福利 | 国产三级精品播放 | 美女翘臀跪床被打屁股作文 | 本站只有精品 | 国产成人精品免费午夜 | 网站在线播放 | naruto tube18动漫| 人与动videos| 天天操丝袜 |