PHP:有没有" include_once"重置堆栈?

时间:2015-06-18 21:48:31

标签: php php-include

说我有这段代码:

class control {
  function public_home()
    {
        $pagina=$this->load_public_page();
        ...
        echo $pagina;
    }

...
        function load_public_page($localnode="") {

            global $language;

            if ($localnode != "") { $localnode="_" . $localnode; }

            $langlink = "http://" . PAGE_INDEX;
            if ($language != "es") { $langlink = $langlink . "/" . $language . "/"; }

            ob_start();
            include_once 'page.php';
            include_once 'header.php';
            $pagina=ob_get_contents();
            ob_end_clean();
            return $pagina;
            }
...
}

然后,在page.php

<?php
echo "LANG " . $langlink;
echo "NODE " . $localnode;
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
...

page.php应该能够毫无问题地访问$langlink$localnode变量,对吗? (我尝试过一个简化的例子,它确实有用)。嗯,就我而言,它并没有;无论我如何尝试,page.php中的代码都表示$langlink$localnode未定义。

不仅如此:如果我向var_dump(debug_backtrace())添加page.php,它只会显示给我:

array(1) {
  [0]=>
  array(3) {
    ["file"]=>
    string(53) "index.php"
    ["line"]=>
    int(55)
    ["function"]=>
    string(12) "include_once"
  }
}

换句话说,它既没有提取load_public_page函数,也没有提取其包含的类......难怪它无法找到这些变量。

这非常奇怪,因为看看我上面提到的简化例子:

class Ble {
    function bla() {
        $a=127;

        $pagina=$this->otrosi();
        echo $pagina;
        }

    function otrosi($bbb="") {

        $a=666;

        ob_start();
        include_once('b.php');
        $pagina=ob_get_contents();
        ob_end_clean();

        return $pagina;
        }
    }

$g=new Ble();   
$g->bla();

b.php的位置:

<p>BBB is: <?php echo $bbb; ?></p>

<p>What is A? <?php echo $a; ?>

它确实将$a打印为666,当然,如果我在debug_backtrace中添加b.php,它会显示完整的堆栈跟踪: object Ble, function bla, function otrosi ...

正如标题所说:有没有人知道include_once或输出缓冲可能会在PHP中重置堆栈的任何情况?我有点绝望,因为根据文档和简单的例子,这应该是其中之一,它应该起作用......然而它并没有。

0 个答案:

没有答案