在 CakePHP 中使用 SimpleExcel 遇到的一个有关问题小记
在 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>
版权声明:本文为博主原创文章,未经博主允许不得转载。

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.
