PHP 和 FDPF 在 ExpressionEngine 中出现错误“致命错误:调用非对象上的成员函数”


PHP & FDPF error 'Fatal error: Call to a member function on a non-object' in ExpressionEngine

我正在使用 FPDF 将通道数据从 ExpressionEngine 导出为 PDF 文件。我正在使用的 FPDF 东西是我之前在另一个项目中使用的代码,所以它应该可以工作。FPDF对象的正常方法可以工作,但是一旦它们被包装在一个函数中,我就会得到:

Fatal error: Call to a member function MultiCell() on a non-object

所以这有效:

include '../apps/assets/fpdf.php';
// setup the PDF object:
$pdf = new FPDF();
$pdf->SetMargins(0,0,0);
$pdf->SetAuthor("Author");
$pdf->addPage("P", "A4");
$pdf->SetTextColor(82,82,82);
// write something to the PDF:
$pdf->MultiCell(80, 6, "some text here", 0, "L");

但这不会:

include '../apps/assets/fpdf.php';
// setup the PDF object:
$pdf = new FPDF();
$pdf->SetMargins(0,0,0);
$pdf->SetAuthor("Author");
$pdf->addPage("P", "A4");
$pdf->SetTextColor(82,82,82);
writeStuff("some stuff to write");
function writeStuff($stuff) {
    global $pdf;
    $pdf->MultiCell(80, 6, $stuff, 0, "L");
}

最后一个代码块抛出错误,如上面发布的那样。

这很奇怪,因为完全相同的设置以前确实有效。主要区别在于,这一次,PHP 被包装在表达式引擎模板中。该模板确实启用了 PHP 解析,我在同一应用程序中使用了大量其他模板,其中包含大量 PHP 可以工作。

它与 ExpressionEngine 的解析顺序有关吗?在创建$pdf对象之前是否调用了"writeStuff"方法?

有什么想法吗?

问题是EECMS模板中的php是使用eval()运行的。这意味着您的 php 正在本地范围内运行。因此,您必须在函数定义内部和外部的变量上使用 GLOBAL 关键字。

例:

<?php
global $foo;
$foo = 'Hello World!';
bar();
function bar() {
  global $foo;
  echo $foo;
}
?>

因此,对于您的模板,只需将其更改为以下内容:

include '../apps/assets/fpdf.php';
// setup the PDF object:
global $pdf;
$pdf = new FPDF();

曾经有一篇很棒的知识库文章,但现在似乎已经消失了。我能够获得原始文件的回溯存档:

http://web.archive.org/web/20090207200929/http://expressionengine.com/knowledge_base/article/my_php_functions_cannot_reference_global_php_variables/

希望对您有所帮助!