从外部函数调用php方法会产生错误

时间:2013-03-02 03:46:21

标签: php fpdf

function KeepSamePage($text)
 {
$sb_w = $oPdf->GetStringWidth($text);

$num_lines = explode("\n",$text);

$total = 0;
foreach($num_lines as $line)
 {

  $y = $oPdf->GetY();
  $page_height = 11 * 25.4;

  $this_width = $oPdf->GetStringWidth(strip_tags($line));
  $extra_line = floor($this_width / $w);
  $is_line = $this_width / ($w - 1);
  $is_line = $this_width == 0 ? 1 + $extra_line : ceil($is_line) + $extra_line;
  $total = $total + $is_line;
 }

  $sb_height = $total * 5;
  if(($page_height - $y) < $sb_height){ $oPdf->AddPage(); }
}

KeepSamePage($signature_block);

我正在使用FPDF并且我正在创建一个函数来保持字母的签名页面都在同一页面上。这将检查它是否会转到下一页,如果是soo,那么它会执行AddPage();

我遇到的问题是,当我没有在函数中使用它时,它运行得很好,但是当我把它放在一个函数中时,我在调用类所代表的方法时会出错按$ oPdf。

所以,我的问题一般是这样的:是否有可能在PHP中使用常规函数调用类方法,如下所示?如果有可能,我做错了什么?

错误产生的是:

Fatal error: Call to a member function GetStringWidth() on a non-object in /home/jarodmo/public_html/cms/attorney_signature_block.php on line 18

哦,以及对我的功能的解释,以防您感兴趣或其他人发现它。

文本对其中的新行有\ n,因此PDF会将签名块的文本放在下一行。每个新的数组元素都应该是一个新行,所以我需要将行数乘以行高,在这种情况下为5。 (见$ total * 5)。

我检查一下我们在页面上的位置,找到页面高度和Y位置之间的差异,然后根据签名块的高度进行检查。如果签名块较大,那么它就不合适了,我知道我们需要手动分页。

另外,因为我用\ n进行爆炸以查看线条,我还必须检查以确保没有任何线条仍然比页面宽,否则它会自动换行并且实际上是2行(或者更多)我只把它算作1,因为它只是一个数组元素。我知道一个签名块不应该有足够的文本在2行,但我写这个不仅适用于签名块。我希望能够在任何想要确保某些文本保留在同一页面上的地方调用此函数。调用该函数,检查我要写入PDF的文本,然后继续知道所需的文本都在同一页面上。

感谢所有的帮助和评论。这是最好的。

3 个答案:

答案 0 :(得分:1)

$oPdf 

未在您的代码中定义。您需要定义它,也许可以阅读PHP variable scope.

您正在尝试访问函数中$ oPdf对象的方法,但您的函数不知道$ oPdf是什么,因此,错误消息。

答案 1 :(得分:1)

你必须做这样的事情。

function KeepSamePage($text) {
$oPdf = new your_string_class();
$sb_w = $oPdf->GetStringWidth($text);
}

$oPdf = new your_string_class();
function KeepSamePage($text, $oPdf) {
$sb_w = $oPdf->GetStringWidth($text);
}

答案 2 :(得分:0)

尝试以下方法:

function KeepSamePage($text) {
    global $oPdf;

    …
}

问题是,该对象是在您的函数之外定义的,您必须允许您的函数访问它。

//编辑: 如果你想以任何理由避免全局,你必须将你的对象传递给这样的函数:

function KeepSamePage($text, $oPdf) {
    …
    // IMPORTANT! $oPdf has changed in this function, so you will have to give it back
    return $oPdf;
}

您可以这样调用您的函数:

$oPdf = KeepSamePage($signature_block, $oPdf);

优点是,您在主线程中看到,您的函数可能已更改了对象。

//编辑2:我想,在你的情况下我在edit1上错了。当您将完整对象传递给函数时,每个更改都会应用于对象,因此更改仍然存在且不会返回结果。如果这是在主线程中定义的变量,则必须返回新值:

$a = 1;

function result1($a) {
    ++$a;
}

function result2($a) {
    return ++$a;
}

echo $a."\n"; // 1
result1($a);
echo $a."\n"; // 1
$a = result2($a);
echo $a."\n"; // 2