PHP& FDPF错误'致命错误:在ExpressionEngine中调用非对象上的成员函数'

时间:2012-04-27 08:00:55

标签: php expressionengine fpdf

我正在使用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被包装在ExpressionEngine模板中。该模板确实启用了PHP解析,我在同一个应用程序中使用了大量其他模板,其中包含大量可用的PHP。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题是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/

希望有所帮助!