路径和 Class 名称正确,但无法使用继承 PHP Class

The Path and Class Name is Correct, But Failed To Use Inherited PHP Class

我正在使用 FPDF 和 WriteHTML 脚本 (http://www.fpdf.org/en/script/script42.php) 将我的 HTML 转换为 PDF。

我已经将 FPDF 库连同 WriteHTML 脚本一起下载到我的 /lib/fpdf 文件夹中。

那么 /lib/fpdf 文件夹中的内容是:

/lib/fpdf/fpdf.php
/lib/fpdf/html2pdf.php

然后我写这段代码:

require_once ('html2pdf.php');
$html_code = ''; // some HTML code here

$pdf = new PDF_HTML();
$pdf->AddPage();
$pdf->WriteHTML($html_code);
$pdf->Output(); 

这个简单的代码给我这个错误:

Fatal error: Call to undefined method PDF_HTML::FPDF() in /home/***/html2pdf.php on line 52

这就是第 52 行的真正含义:

$this->FPDF($orientation,$unit,$format);

为什么我在正确按照教程进行操作时收到该错误消息。为什么 html2pdf 脚本无法识别该方法?谢谢

错误说明了一切。您尝试调用根本不存在的方法。我看了PDF_HTML class的源码,确实没有这个方法

可用的方法有(+ FPDF class 定义的方法):

  • PDF_HTML() class
  • 的构造
  • WriteHTML()
  • OpenTag()
  • CloseTag()
  • SetStyle()
  • PutLink()

看来您要么实例化了错误的 class,要么调用了错误的函数。

您只需将 html2pdf.php 中的函数 PDF_HTML 重命名为 __construct(使其成为 新样式 PHP构造函数)并将 $this->FPDF 替换为 parent::__construct(以调用正确的函数):

// THIS: 
function PDF_HTML($orientation='P', $unit='mm', $format='A4')
{
    //Call parent constructor
    $this->FPDF($orientation,$unit,$format);

// BECOMES THAT:
function __construct($orientation='P', $unit='mm', $format='A4')
{
    //Call parent constructor
    parent::__construct($orientation,$unit,$format);

解释:

问题是 fpdf.php (1.8) 的最新版本使用了新式构造函数 (__construct) 而 script42.php 中的 PDF_HTML 尚未更新为使用新式构造函数(旧式构造函数是 ClassName)。

由于 PDF_HTML 继承自 FPDF$this->FPDF 应该调用父构造函数(参见 Calling PHP Parent Constructors With Old/New Syntax),如果 FPDF 是使用旧式构造函数:

class FPDF {
    // Constructor (in PHP < 5.3.3), Deprecated in PHP 7+
    public function FPDF () {

    }
}

class PDF_HTML {
    // Constructor (in PHP < 5.3.3)
    public function PDF_HTML () {
        $this->FPDF(); // Call to parent constructor
    }
}

您在 script42.php 中清楚地看到 PDF_HTML 使用旧式构造函数:

function PDF_HTML($orientation='P', $unit='mm', $format='A4')

不幸的是,FPDF 1.8 使用新样式构造函数:

class FPDF {
    public function __construct () { }
}

因此您不能使用旧样式调用以新样式定义的父构造函数。


注意:如果你真的想像现在一样使用script42.php的代码,你应该尝试寻找旧版本的fpdf.php (FPDF 1.7 使用旧式构造函数)并使用 PHP 版本 < 7,因为旧式构造函数在 PHP 7+ 中已弃用(在 PHP 5.3.3+ 中是 considered standard function)。