本篇文章為大家展示了PHPExcel怎么在Yii框架中使用,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)是一家專業(yè)提供咸寧企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、做網(wǎng)站、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為咸寧眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。PHPExcel是一個比較好用的php讀取excel文件的類庫,今天遇到了在yii中如何加載PHPExcel類文件的問題,因為Yii的autoload機(jī)制是安裝類名去找文件,即文件名就是相應(yīng)的類名,而PHPExcel的類文件命名方式則是:dir_dir_classname.php,即文件名把文件的目錄名都記錄了,這種命名方式y(tǒng)ii肯定識別不了。怎么辦?
其實PHPExcel也有自己的autoload方法(PHPExcel_Autoloader::load()
),通過查看源碼發(fā)現(xiàn)它也是通過spl_autoload_register
函數(shù)注冊的(在PHPExcel_Autoloader::register()
中),而我們知道PHP的autoload機(jī)制是,所有用spl_autoload_register
函數(shù)注冊的方法,都會在autoload時被spl_autoload_call
函數(shù)執(zhí)行一遍,因此我們只需要讓PHPExcel的autoload方法順利注冊上就行了。
如果了解Yii的autoload機(jī)制,不清楚的可以看 附錄 Yii的autoload機(jī)制 ,可以知道,只要設(shè)置Yii::$enableIncludePath
為false,第三方類庫就有了執(zhí)行自己的autoload方法的機(jī)會,然后使用下面兩行代碼就能加載PHPExcel的類了:
Yii::$enableIncludePath = false; Yii::import('application.vendors.phpexcel.PHPExcel', 1);
import時采用了force include的方式,這是因為PHPExcel.php在被require時才會注冊autoloader,如果等到new PHPExcel時才注冊,其他的類例如PHPExcel_IOFactory如果在這之前使用了,就會出現(xiàn)找不到類的錯誤。
個人認(rèn)為我的這種辦法是比較方便且優(yōu)雅的,對比網(wǎng)上的其他辦法好很多,下面列舉的辦法都或多或少有點問題,例如:
1、/tupian/20230522/166128.htm,這種辦法先將Yii自己的autoloader unregister了,會造成yii自己的類加載不上
2、/tupian/20230522/ppstrong附錄: Yii的autoload機(jī)制
Yii框架宣稱自己的類加載方式很高效,是真正的“用時加載”,那究竟特別在哪里?今天研究了一下源碼,發(fā)現(xiàn)其實是在代碼級加了一層“路徑緩存”。
我們知道,要實現(xiàn)自己的autoload方法,需要采用spl_autoload_register()
函數(shù)注冊一個autoload方法,Yii注冊的這個方法是YiiBase::autoload()
,稍后再講解這個方法的邏輯。另外,Yii一般都用Yii::import($pathAlias, $forceInclude=false)
來加載相應(yīng)的類(這個方法直接調(diào)用了YiiBase::import()
),這個方法配合YiiBase::autoload()
就能實現(xiàn)“用時加載”了。
先說import的大致邏輯:
1、檢查self::$_imports
數(shù)組是否存在相應(yīng)的$pathAlias,如果有說明已經(jīng)加載過了,直接返回類名或者目錄名;否則繼續(xù)第2步;
2、根據(jù)路徑別名獲得實際的路徑名,并根據(jù)路徑別名最后一部分是否是“*”可以知道要加載的路徑別名是否是一個文件,如果是文件,去第3步;否則去第4步;
3、如果是$forceInclude是true,則立即require這個文件,并在$_imports數(shù)組中增加一項$alias => $className
;否則在數(shù)組$classMap中緩存一項$className => $realPath
;
4、對于路徑,會在數(shù)組$_includePaths中緩存這個路徑,并且在$_imports數(shù)組中增加一項$alias => $realPath
;
5、結(jié)束。
因為$forceInclude默認(rèn)都為false,所以import不會立即加載相應(yīng)的類,等到使用時才真正加載,這是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()
失敗時,其他類庫的autoload方法有機(jī)會執(zhí)行。
上述內(nèi)容就是PHPExcel怎么在Yii框架中使用,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。