【问题标题】:The Path and Class Name is Correct, But Failed To Use Inherited PHP Class路径和类名正确,但无法使用继承的 PHP 类
【发布时间】:2016-06-06 08:50:59
【问题描述】:

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

我已经在 /lib/fpdf 文件夹中下载了 FPDF 库以及 WriteHTML 脚本。

那么/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 是你自己的类吗,如果是,它是如何定义的?
  • 不,兄弟。 PDF_HTML 不是我的课。这是源代码:fpdf.org/en/script/script42.php

标签: php fpdf


【解决方案1】:

您只需将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);

说明:

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

由于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 版本 &lt; 7 因为旧式构造函数在 PHP 7+ 中已弃用(并且在 PHP 5.3.3+ 中是 considered standard function)。

【讨论】:

  • 你的解释让这个问题看起来很清楚,兄弟。非常感谢,我真的很感激。
【解决方案2】:

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

可用的方法是(+ FPDF 类定义的方法):

  • PDF_HTML()该类的构造器
  • WriteHTML()
  • OpenTag()
  • CloseTag()
  • SetStyle()
  • PutLink()

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

【讨论】:

  • 我觉得这个类有问题:fpdf.org/en/script/script42.php。它有PDF_HTML 作为类名,也有PDF_HTML 作为方法名。一旦我将类名更改为PDF2HTML,就不再有错误消息了。我还是 PHP OOP 的新手,但是使用类名作为方法名是违法的吗?
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2012-03-16
  • 2016-03-12
相关资源
最近更新 更多