【问题标题】:php how to redeclare class in a for loopphp如何在for循环中重新声明类
【发布时间】:2015-03-10 21:29:15
【问题描述】:

我使用了一个名为 PDFmerger 的库,它自然地将 pdf 合并在一起。我希望每天晚上运行一个 cron 来构建这些,以便为第二天做好准备。问题是当我在第一个代码之后运行代码时它失败了,因为它试图重新声明类。

for 声明...

            foreach ($pdfs_to_build as $pdf) {

                // do stuff

                $this->merge_pdfs($pdf['pdf_id']);

            }

我的 pdf 合并代码在循环中运行...

$pdf = new PDFMerger;

$pdf->addPDF(DIR_BOOKS.$book_path.'/static-pages/page-1.pdf', '1'); 
$pdf->addPDF(DIR_FINAL_PDFS.$pdf_id.'/custom-page-1.pdf','1'); 
$pdf->addPDF(DIR_BOOKS.$book_path.'/static-pages/page-2.pdf', '1'); 

$pdf->merge('file', DIR_FINAL_PDFS.$pdf_id.'/final-build-'.$pdf_id.'.pdf');

第一个完成后出错,我们进入下一个...

致命错误:无法在第 24 行的 /var/www/example/pdfmerger/PDFMerger.php 中重新声明类 PDFMerger

我想知道是否有解决方法?

【问题讨论】:

  • 您缺少括号:$pdf = new PDFMerger();
  • 尝试在文件末尾取消设置类对象...
  • 您可能在merge_pdfs 中拥有include pdfmerger.php。一个简单的解决方法是将其放在全局范围内。
  • 分号应该放在括号后面吧?新 PDFMerger();
  • @bcesars:它们不是必需的。 $x = new stdClass;$x = new stdClass(); 一样有效 括号不是问题

标签: php oop


【解决方案1】:

问题不在于您两次调用new PDFMerger,这是完全可以接受的。问题是文件:

/var/www/example/pdfmerger/PDFMerger.php

include'd(或以其他方式执行)两次,在第 24 行:

class PDFMerger {

这就是触发错误的原因,该类已被声明。弄清楚为什么该文件被包含两次,您的错误就会清除。

【讨论】:

  • require_once 是一个不错的选择。在循环中包含/要求声明类/函数/常量等的文件是不好的设计。在这种情况下,OP 很幸运,他使用的 php 很糟糕,不允许用相同的名称覆盖类,因此出现错误。
  • @chelmertz:一个像样的自动加载器会更好。循环中的require_once 在很多方面都很丑陋(而且不可靠,如果您循环的值是空的,则不需要类定义,并且您很快就会得到充斥着require_once 语句的代码,每次检查包含哪些文件,哪些不包含。最好的选择仍然是一个自动加载器,它只是 require 的文件
【解决方案2】:

您的代码很好。那不会失败的。但是,未在您发布的内容中列出,您包括PDFMerger.php。 可能通过让https://pdfmerger.codeplex.com/ 中显示的include 'PDFMerger.php'; 在循环内运行。

只需将该行移出循环和/或将include 更改为include_once

【讨论】:

  • include_oncerequire_once 将解决此问题,但最好将其排除在循环之外(每个 include_once 语句检查是否文件已包含在内 -> 开销)。最好还是使用自动加载器...
  • 就我个人而言,我会将其移出循环将其更改为require_once,但我也想暗示include_once 可以是一个解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
相关资源
最近更新 更多