PHP报错Only variables should be passed by reference 及.docx读取求助
解决PHP读取本地.docx时的"Only variables should be passed by reference"报错
嘿,作为刚接触PHP的新手,遇到这个报错完全不用慌!我来帮你一步步理清问题、解决它~
错误原因拆解
你看到的这个Notice: Only variables should be passed by reference错误,核心原因是:某个PHP函数需要接收一个「变量引用」当参数,但你直接传了临时的表达式或者函数返回值。
举个最常见的例子:如果你在第9行写了类似$ext = end(explode('.', 'test.docx'));这样的代码,end()函数要求参数必须是一个能被修改的变量(它要调整数组的内部指针),但explode()返回的是一个临时数组,没法被当作引用传递,所以就触发了这个提示。
分步解决步骤
1. 修复引用传递问题
把原本直接塞进函数的临时值,先存到一个变量里,再把变量传给函数就行。比如:
❌ 错误写法:
$extension = end(explode('.', $filename));
✅ 正确写法:
// 先把拆分后的数组存到变量里 $fileParts = explode('.', $filename); // 再把变量传给end() $extension = end($fileParts);
2. 可用的本地.docx读取测试代码
我给你写了一套能直接运行的测试代码,先帮你验证本地docx文件能不能被正常读取(注意:docx本质是压缩包,直接读会显示乱码,这是正常的,我们先确保文件能被PHP访问到):
<?php echo "Testing<br>"; // 定义docx文件的路径,和test3.php同目录的话直接写文件名就行 $docxFile = 'test.docx'; // 先检查文件是不是真的存在 if (!file_exists($docxFile)) { die("哎呀,文件找不到!请确认test.docx和test3.php在同一个文件夹里哦"); } // 读取文件内容 $fileData = file_get_contents($docxFile); // 输出文件大小来验证读取成功 echo "文件读取成功啦!文件大小:" . strlen($fileData) . " 字节<br>"; // 要是之后想提取docx里的文字内容,后面我会给你说方法~ ?>
3. 运行验证
把上面的代码替换你当前的test3.php内容,然后打开浏览器访问http://localhost/technical/test3.php:
- 如果看到「Testing」+「文件读取成功啦!...」的提示,说明基础读取功能没问题了
- 如果还是报错,那你可以把第9行的代码贴出来,我帮你再调整
后续扩展:提取docx里的文本内容
如果你最终要提取docx的文字内容,推荐用PHPWord这个专门的类库:
- 下载PHPWord的压缩包,把里面的
src文件夹放到你的technical目录下 - 用下面的代码就能解析出文本:
<?php require_once 'src/PhpOffice/PhpWord/Autoloader.php'; \PhpOffice\PhpWord\Autoloader::register(); $docxFile = 'test.docx'; $phpWord = \PhpOffice\PhpWord\IOFactory::load($docxFile); $textContent = ''; // 遍历文档的所有章节和元素,提取文本 foreach ($phpWord->getSections() as $section) { foreach ($section->getElements() as $element) { if (method_exists($element, 'getText')) { $textContent .= $element->getText() . "\n"; } } } echo "docx里的文本内容:<br>" . nl2br($textContent); ?>
内容的提问来源于stack exchange,提问作者DeveloperLV
相关产品推荐
相关产品推荐

