【问题标题】:PHP class not found but class file successfully included未找到 PHP 类,但已成功包含类文件
【发布时间】:2016-04-28 09:41:08
【问题描述】:

我下载了一个非常小的示例文件,我在尝试让 PHPWord 工作时正在使用它。我收到以下错误消息,但不知道为什么。

PHP 致命错误:在第 6 行的 /var/www/html/PhpOffice/ex_01.php 中找不到类“PHPWord”

我下载的小示例程序是:

<?php
  require_once 'PhpWord.php';

  echo realpath (dirname(__FILE__)) . "\n";

  $PHPWord = new PHPWord();     <-- <-- <-- LINE 6 HERE
  $section = $PHPWord->createSection();
  $section->addText('Hello world!');
  header("Cache-Control: public");
  header("Content-Description: File Transfer");
  header("Content-Disposition: attachment; filename=helloWorld.docx");
  header("Content-Type: application/docx");
  header("Content-Transfer-Encoding: binary");
  $objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
  $objWriter->save('helloWorld.docx');
?>

网上发布的PhpWord.php文件有点大,不方便发布,关键是第43行和第44行及以下包含拼写匹配和大小写匹配的类代码:

class PHPWord
{

出于调试目的,我从命令行运行代码。这似乎给了我有意义的错误信息。

“要求”似乎正在查找文件。 “echo dirname”发布“/var/www/html/PhpOffice”,这是两个文件的正确位置。此外,作为一个实验,我在“require”语句中的文件名中添加了一个错字,这导致了“找不到文件”错误。因此,“require”看起来不错。

我有一些 PHP 经验,但这是我第一次阅读 PHP 中的类和命名空间。到目前为止,我不知道出了什么问题。有什么建议吗?

谢谢你, 布鲁斯

【问题讨论】:

  • IIRC,我最近通过检查源代码解决了一个类似的问题,并注意到它是用 &lt;? 而不是 &lt;?php 打开的,如果你的 php.ini 设置为处理它,它就可以工作——我的不是。也许检查一下?
  • PHPWord 是命名空间的...。您需要通过其完整的命名空间名称来引用该类...。$phpWord = new \PhpOffice\PhpWord\PhpWord(); 尝试查看/samples 文件夹中的一些示例
  • 使用新的 \PhpOffice\PhpWord\PHPWord();我现在得到: PHP Fatal error: Class 'PhpOffice\PhpWord\Settings' not found in /var/www/html/PhpOffice/ex_01.php on line 6. 我将不得不做一些挖掘,但我怀疑我的第一个问题已解决,我现在在较低级别的调用上失败了。我仍然对命名空间有些困惑,如果分布式 PhpWord 文件由于内部代码而无法运行,显然我的安装中没有正确的东西。

标签: php class


【解决方案1】:

我第一次阅读 PHP 中的类和命名空间

如果PhpWord.php 中的内容类似于namespace XYZ; 然后,您也必须在脚本的第一行中放置 use \XYZ\PHPWord;

如果你在一个命名空间内并且类没有,那么你必须使用$PHPWord = new \PHPWord();

如果您没有autoloader,您也必须包含属于PHPOffice 的所有文件,然后您可以使用use \PHPOffice\PHPWord();

【讨论】:

  • 我仍在尝试掌握命名空间问题和陷阱,但这是我在 PhpWord.php 中找到的唯一“使用”和“命名空间”行。
  • 命名空间 PhpOffice\PhpWord;使用 PhpOffice\PhpWord\Element\Section;使用 PhpOffice\PhpWord\Exception\Exception;
  • 所以即使找到类文件我还需要添加一个“使用”来允许加载类文件中的类?
  • 你能建立一个自动加载器吗?
  • 请注意,PHPWord 是为与 composer 一起安装和使用 composer autoloader 而编写的
【解决方案2】:

远程服务器的解决方案(我为 GoDaddy 解决了我的问题):

如果您使用的是 cpanel,您可能安装了 zip 扩展但未激活。你需要激活它。对于这种情况,您需要转到 cpanel > 内部软件部分 > 单击 PHP 版本。然后找到zip并检查它。现在保存。

刷新您的申请页面。

【讨论】:

  • 为什么一个名为PHPWord 的PHP 类在激活PHP 扩展后变得可用?这没有任何意义
  • Nico Haase 为什么你投了反对票?通过启用 zip 扩展,它对我来说没有任何问题。
  • 正如我所说:根据给定的错误消息(而不是任何其他类似的用例,只是看起来相同但完全不同),启用 PHP 扩展不能成为核心解决方案
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多