说我有这段代码:
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中重置堆栈的任何情况?我有点绝望,因为根据文档和简单的例子,这应该是其中之一,它应该起作用......然而它并没有。