在一个页面中多次包含PHP文件

5

我有一个名为kal_test.php的php文件,它给变量$vbl赋值。这个变量在名为kal_generator.php的文件中需要,该文件从该变量生成表格(我会省略细节)。具体如下:


[kal_test.php]

<?php
$vbl = "14/09/2011";
include ("kal_generator.php");
?>

[kal_test.php]

<?php
// Long code converts the $vbl into a 2-dimensional array called $output
// I'll spare you the details (it works fine by the way)
?>

<table>
  <tr><th>bla</th><th>blabla</th></tr>

<?php
foreach ($output as $v1) {
    echo "<tr>";
    foreach ($v1 as $v2) {
        echo "<td>$v2</td>";
    }
    echo "</tr>\n";
}
?>

</table>

这个设置很好用,但是我不能在同一页上展示两个这样的网页,就像这样:

[kal_test.php]


<?php
$vbl = "14/09/2011";
include ("kal_generator.php");
$vbl = "21/09/2011";
include ("kal_generator.php");
?>

这将产生以下结果:
//here comes the header

<table> // table created with $vbl = "14/09/2011"
  <tr><th>bla</th><th>blabla</th></tr>
  <tr><td>this</td><td>works</td></tr>
  <tr><td>this</td><td>works</td></tr>
</table>

//here should the second table be and also the rest of the page (footer), this is completely missing

我做错了什么?谢谢!


4
不要这样做。将函数放入一个包含文件中,并在每次需要时调用该函数。 - Brad
我很想这样做,但是那段代码(惊喜!)真的很长。 - gieldops
1
谁在乎呢……用 function 关键字和几个括号把它包起来有什么难的吗?或许你应该考虑把那个函数分成几个函数。 - Brad
1个回答

14

你可能在kal_generator.php中定义了一个函数或类。当你尝试重新定义这样的函数或类时,PHP会中止执行。考虑将代码放入一个函数中,只包含该函数一次,然后运行该函数,而不是包含一个文件。

kal_test.php

<?php
require_once 'kal_generator.php';
kal_generator("14/09/2011");
kal_generator("21/09/2011");
?>

kal_generator.php

<?php
function kal_generator($vbl) {
    /**
     * Here, you should be creating $output
     */
    echo <<EOF
<table>
  <tr><th>bla</th><th>blabla</th></tr>

EOF;
    foreach ($output as $v1) {
        echo "<tr>";
        foreach ($v1 as $v2) {
            echo "<td>$v2</td>";
        }
        echo "</tr>\n";
    }

    echo "</table>\n";
}
?>

Brad说了同样的话,我会尝试这个,但是重写代码需要很长时间。我应该早点想到这个问题 :( - gieldops
@gieldl,有什么需要重写的吗? - Brad
如果代码太长了,那么你一定做错了什么。将代码分解成部分(函数、方法等)。 - Lekensteyn
根据我们在示例中所给的代码,Brad是正确的;几乎没有需要重写的部分。然而,我曾经遇到过一些糟糕编写的代码,它们与问题描述非常相似,重写起来非常困难,因此我知道这可能会很痛苦。但我仍然认为你应该这样做。如果代码太糟糕以至于按照这个答案进行重写很困难,那么这就是它需要被重写的明确信号! - Spudley
顺便说一下,如果你要使用这个答案,你可能想使用include_once()函数而不是include()。(这不会有任何区别,但如果你意外地尝试包含两次,它可能会在以后节省你的错误) - Spudley
@Spudley:如果有定义类或文件,我总是使用require_once来避免后期崩溃,因为假如没有检查函数的存在性就使用它会导致崩溃。不过你的建议使用*_once很好。 - Lekensteyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接