在 CakePHP 中使用 SimpleExcel 遇到的一个问题小记
前言
以前在公司做的一个项目中遇到的一个问题,还有意思的。
问题
大家有没有在 CakePHP 中使用过第三方库?我现在在引入了一个名为 SimpleExcel 的第三方库时遇到了一些问题。我觉得问题可能跟我把这个库的库文件放在了不正确的目录下有关。
正常情况下,该库在解压后,会有一个名为 SimpleExcel 的目录,该目录下的文件结构如下:
<code>[email protected]:~/Desktop/faisalman-simple-excel-php-8d9fabc/src/SimpleExcel$ lsException Parser SimpleExcel.php Writer</code>
使用的话,只需要在相应的 PHP 文件中引入该库就可以了,如下所示:
<code>// test.php// 该文件和 SimpleExcel 目录在同一个目录,所以下面的 require_once 中的路径为 ./SimpleExcel/SimpleExcel.phpuse SimpleExcel\SimpleExcel;require_once('./SimpleExcel/SimpleExcel.php'); </code>
现在在 CakePHP 中,我是这样做的,将 SimpleExcel 目录放在了app/controllers 目录下,然后在相应的控制器中加入了如下代码:
<code>use SimpleExcel\SimpleExcel;require_once('SimpleExcel/SimpleExcel.php'); </code>
但在访问该控制器时,总是出现问题,错误信息如下:
<code>Warning (2): require_once(/opt/xplico/xi/app/controllers/SimpleExcel/ontroller.php) [function.require-once]: failed to open stream: No such file or directory [APP/controllers/SimpleExcel/SimpleExcel.php, line 43]</code>
到底我哪里做错了?
答案
首先,请看下这篇文章《PHP autoload机制详解》。因为之前遇到的问题的根本原因就在于 SimpleExcel 库在使用 autoload 机制时不够严谨。
现在,重新看下那个错误提示:
<code>Warning (2): require_once(/opt/xplico/xi/app/controllers/SimpleExcel/ontroller.php) [function.require-once]: failed to open stream: No such file or directory [APP/controllers/SimpleExcel/SimpleExcel.php, line 43]</code>
从提示中可以看到,SimpleExcel.php 这个文件已经执行了,也就是说,之前我们将 SimpleExcel 库放在了 app/controllers 目录下,并在控制器中加入的如下代码是没有问题的。
<code>use SimpleExcel\SimpleExcel;require_once('SimpleExcel/SimpleExcel.php'); </code>
那为什么 SimpleExcel.php 会出现问题呢?现在定位到该文件出错的地方,如下所示:
<code>if (!class_exists('Composer\\Autoload\\ClassLoader', false)){ // autoload all interfaces & classes spl_autoload_register(function($class_name){ // TODO(H): 错误就出在这里的require_once语句上 if($class_name != 'SimpleExcel') require_once(dirname(__FILE__).DIRECTORY_SEPARATOR.str_replace('\\', DIRECTORY_SEPARATOR, substr($class_name, strlen('SimpleExcel\\'))).'.php'); });}</code>
为什么这里会出错,结合上面的错误信息,这里 require_once 了一个不存在的文件?那这个不存在的文件时怎么来的呢?这就涉及到 autoload 机制。这个不存在的文件的路径是 SimpleExcel.php 文件自身所在目录加上当前控制器需要的类的名字构成的。作为一个控制器,它当然需要 Controller 父类,但这个类并不在 /opt/xplico/xi/app/controllers/SimpleExcel 目录下,当然就出错了。
其实,SimpleExcel 库的作者本意是利用 autoload 机制加载 SimpleExcel.php 自身所需要的一些类(位于Exception、Parser 和 Writer 目录下),但这里对要加载的类的过滤不够严谨,就出现了上面我们遇到问题。
修改方式,注释上面的代码,加入如下代码,解决问题。
<code>$currentDir = dirname(__FILE__);require_once($currentDir . '/Parser/IParser.php');require_once($currentDir . '/Parser/BaseParser.php');require_once($currentDir . '/Parser/CSVParser.php');require_once($currentDir . '/Parser/HTMLParser.php');require_once($currentDir . '/Parser/JSONParser.php');require_once($currentDir . '/Parser/TSVParser.php');require_once($currentDir . '/Parser/XLSXParser.php');require_once($currentDir . '/Parser/XMLParser.php');require_once($currentDir . '/Writer/IWriter.php');require_once($currentDir . '/Writer/BaseWriter.php');require_once($currentDir . '/Writer/CSVWriter.php');require_once($currentDir . '/Writer/HTMLWriter.php');require_once($currentDir . '/Writer/JSONWriter.php');require_once($currentDir . '/Writer/TSVWriter.php');require_once($currentDir . '/Writer/XLSXWriter.php');require_once($currentDir . '/Writer/XMLWriter.php');require_once($currentDir . '/Exception/SimpleExcelException.php');</code>
版权声明:本文为博主原创文章,未经博主允许不得转载。

vue3+vite:src使用require动态导入图片报错和解决方法vue3+vite动态的导入多张图片vue3如果使用的是typescript开发,就会出现require引入图片报错,requireisnotdefined不能像使用vue2这样imgUrl:require(’…/assets/test.png’)导入,是因为typescript不支持require所以用import导入,下面介绍如何解决:使用awaitimport

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境