PHP:在任何情况下;包括“一次”;重置堆栈?
假设我有这个代码:PHP:在任何情况下;包括“一次”;重置堆栈?,php,php-include,Php,Php Include,假设我有这个代码: class control { function public_home() { $pagina=$this->load_public_page(); ... echo $pagina; } ... function load_public_page($localnode="") { global $language; if ($lo
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">
...
换句话说,它既不拾取load\u public\u页面
函数,也不拾取其包含的类。。。难怪它找不到这些变量
这非常奇怪,因为请看我上面提到的简化示例:
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; ?>
BBB是:
什么是A?
当然,如果我在b.php
中添加debug_backtrace
,它会显示完整的堆栈跟踪:对象Ble、函数bla、函数otrosi
正如标题所说:有人知道在PHP中,
include\u once
或输出缓冲可能会重置堆栈的任何情况吗?我有点绝望,因为根据文档和简单的例子,这是其中之一,它应该可以工作。。。但事实并非如此。include
的作用就好像您要包含的文件的内容被剪切/粘贴到调用include()
的位置一样。这就是全部。如果您在该文件中“可执行”代码,那么它将在include()所在的上下文中执行。如果该文件中有一个exit/die,那么整个脚本将退出,而不仅仅是包含的文件。您不能在多个文件之间传播对象定义。阅读开场白的最后一段。请不要使用register globals:(它们完全是邪恶的。对象和名称空间是你的朋友。globals可能会对调试造成各种破坏!他在哪里使用“register globals”?@steve:我应该提到的是,我没有写这段代码,我只是一直在维护它。无论如何,我不知道我使用的全局变量(不是“register\u globals”)与我发现的bug有什么关系。你的代码中哪里有$control->load\u public\u page(…)
调用?
<p>BBB is: <?php echo $bbb; ?></p>
<p>What is A? <?php echo $a; ?>