飘易有个项目使用了 phpoffice/phpexcel 导出excel,之前使用正常,但是在切换了PHP7.3版本后,就报错了,提示:"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?
排查 composer依赖包,发现是 maatwebsite/excel:2.1.30 依赖了 phpoffice/phpexcel:1.8.2,错误发生的位置是:vendor\\phpoffice\\phpexcel\\Classes\\PHPExcel\\Shared\\OLE.php:288
switch ($type) { case self::OLE_PPS_TYPE_ROOT: $pps = new PHPExcel_Shared_OLE_PPS_Root(null, null, array()); $this->root = $pps; break; case self::OLE_PPS_TYPE_DIR: $pps = new PHPExcel_Shared_OLE_PPS(null, null, null, null, null, null, null, null, null, array()); break; case self::OLE_PPS_TYPE_FILE: $pps = new PHPExcel_Shared_OLE_PPS_File($name); break; default: continue; }
288行就是 switch 语法 default 里使用了 continue 导致报错的,怎么解决这个错误呢?其实提示也给出解决方案了,就是 使用 continue 2 或者 break 。
飘易跑到github上 phpoffice/phpexcel,发现这个包最新的版本就是1.8.2,而且作者把这个项目归档了且只读:https://github.com/PHPOffice/PHPExcel/blob/1.8.2/Classes/PHPExcel/Shared/OLE.php,看来想单独更新这个包就不方便了。
而phpexcel的上级依赖包的版本要求是:maatwebsite/excel:~2.1.0,波浪号的意思就是 >=2.1.0 且 < 2.2.0 (简单来说,~定义了最小的版本,并且允许版本的最后一位版本号进行升级)。项目里已经使用了 maatwebsite/excel 的符合条件的最高版本 2.1.30,但是这个 2.1 的版本却依赖了 phpoffice/phpexcel:^1.8.1,呵呵,到这里就陷入死胡同了。
波浪号~ ~1.2.3相当于>=1.2.3 <1.3.0 折音号^ ^1.2.3相当于>=1.2.3 <2.0.0
要彻底解决,则需要更新上级依赖包 maatwebsite/excel ,可用的新版本 3.1 的依赖要求是:
"require": { "ext-json": "*", "php": "^7.0|^8.0", "phpoffice/phpspreadsheet": "^1.18", "illuminate/support": "5.8.*|^6.0|^7.0|^8.0" }
很遗憾,我的项目使用的 laravel 是 5.5 版本,而 maatwebsite/excel 3.1 最低要求laravel 5.8 版本。
maatwebsite/excel 版本 3.0 的依赖要求是:
"require": { "php": "^7.0", "phpoffice/phpspreadsheet": "^1.2", "illuminate/support": "^5.5" }
嗯,可以使用。
那么目前就有2种思路,一、升级 maatwebsite/excel 版本到 3.0;二、不升级 maatwebsite/excel ,直接修改 vendor 文件夹里 vendor\\phpoffice\\phpexcel\\Classes\\PHPExcel\\Shared\\OLE.php 文件288行。