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

2022-09-26 05:00:14 字數 2265 閱讀 6100

phpexcel是乙個比較好用的php讀取excel檔案的類庫,今天遇到了在yii中如何載入phpexcel類檔案的問題,因為yii的autoload機制是安裝類名去找檔案,即檔名就是相應的類名,而phpexcel的類檔案命名方式則是:dir_dir_classname.php,即檔名把檔案的目錄名都記錄了,這種命名方式yii肯定識別不了。怎麼辦?

其實phpexcel也有自己的autoload方法(phpexcel_autoloader::load()),通過檢視原始碼發現它也是通過spl_autoload_register函式註冊的(在phpexcel_autoloader::register()中),而我們知道php的autoload機制是,所有用spl_autoload_register函式註冊的方法,都會在autoload時被spl_autoload_call函式執行一遍,因此我們只需要讓phpexcel的autoload方法www.cppcns.com順利註冊上就程式設計客棧行了。

如果了解yii的autoload機制,不清楚的可以看 附錄 yii的autoload機制 ,可以知道,只要設定yii::$enableincludepath為false,第三方類庫就有了執行自己的autoload方法的機會,然後使用下面兩行**就能載入phpexcel的類了:

yii::$enableincludepath = false;

yii::import('application.vendors.phpexcel.phpexcel', 1);

import時採用了force include的方式,這是因為phpexcel.php在被require時才會註冊autoloader,如果等到new phpexcel時才註冊,其他的類例如phpexcel_iofactory如果在這之前使用了,就會出現找不到類的錯誤。

個人認為我的這種辦法是比較方便且優雅的,對比網上的其他辦法好很多,下面列舉的辦法都或多或少有點問題,例如:

1、這種辦法先將yii自己的autoloader unregister了,會造成yii自己的類載入不上

2、這種辦法還修改了phpexcel的autoloader,代價很大。

附錄: yii的autoload機制

yii框架宣稱自己的類載入方式很高效,是真正的「用時載入」,那究竟特別在**?今天研究了一下原始碼,發現其實是在**級加了一層「路徑快取」。

我們知道,要實現自己的autoload方法,需要採用spl_autoload_register()函式註冊乙個autoload方法,yii註冊程式設計客棧的這個方法是yiibase::autoload(),稍後再講解這個方法的邏輯。另外,yii一般都用yii::import($pathalias, $forceinclude=false)來載入相應的類(這個方法直接呼叫了yiibase::import()),這個方法配合yiibase::autoload()就能實現「用時載入」了。

先說import的大致邏輯:

1、檢查self::$_imports陣列是否存在相應的$pathalias,如果有說明已經載入過了,直接返回類名或者目錄名;否則繼續第2步;

2、根據路徑別名獲得實際的路徑名,並根據路徑別名最後一部分是否是「*」可以知道要載入的路徑別名是否是乙個檔案,如果是檔案,去第3步;否則去第4步;

3、如果是$forceinclude是true,則立即require這個檔案,並在$_imports陣列中增加一項$alias => $classname;否則在陣列$classmap中快取一項$classname => $realpath;

4、對於路徑,會在陣列$_includepaths中快取這個路徑,並且在$_imports陣列中增加一項$alias => $realpath;

5、結束。

因為$forceinclude預設都為false,所以import不會立即載入相應的類,等到使用時才真正載入,這是yiibase::autoload的工作。

autoload的大致邏輯:

1、檢查類名是否已快取在$classmap或$_coreclasses陣列中,如果是則直接require相應的檔案路徑,$_coreclasses是框架自有類的對映表;否則去第2步;

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

3、遍歷$includepaths陣列,將目錄名拼接上類名,檢查是否為合法的php檔案程式設計客棧,如果是則include,然後跳出迴圈

4、結束。

需要注意的是,文件指出:如果要與其他類庫一起使用,必須將$enableincludepath置為false,以便在yii::autoload()失敗時,其他類庫的autoload方法有機會執行

YII 框架使用redis

安裝redis擴充套件 1.通過composer進行安裝,到專案根目錄cmd執行 推薦 php composer.phar require prefer dist yiisoft yii2 redis或者新增 yiisoft yii2 redis 2.0.0 到對應專案的composer.json檔...

yii框架基本使用

yii framework是乙個基於元件 用於開發大型 web 應用的高效能 php 框架。yii提供了今日web 2.0應用開發所需要的幾乎一切功能。yii是最有效率的php框架之一。最近我在看yii的使用,把記錄留下來,希望能幫助到有需要的朋友。標題獲取http請求和設定http響應 creat...

Yii 中使用 yii bootstrap 擴充套件

第二步 在配置檔案中配置 配置乙個別名 使得可以bootstrap訪問到擴充套件路徑 yii setpathofalias bootstrap dirname file extensions bootstrap return array theme bootstrap 乙個官網給的例子,這個可以暫時...