通过XMLHTTPRequest don'加载PHP;t共享相同的变量范围

通过XMLHTTPRequest don'加载PHP;t共享相同的变量范围,php,html,scope,xmlhttprequest,global-variables,Php,Html,Scope,Xmlhttprequest,Global Variables,我了解PHP中全局变量的概念,并了解全局变量使用的优缺点。尽管如此,我还是决定使用它们,但是我遇到了关于它们的范围和可见性的问题 情况: 根据菜单的选择,我将不同的PHP加载到一个div中。PHP需要相同的公共数据集,我希望避免每次PHP都重新加载并保存在内存中。在下面的示例中,GlobalVars.php将在内存中保存两次,并且还会从数据库中获取两次数据 问题是,通过将它们加载到div中,它们不共享main.html的范围。GlobalVars.php中的全局变量可以通过other.php中的

我了解PHP中全局变量的概念,并了解全局变量使用的优缺点。尽管如此,我还是决定使用它们,但是我遇到了关于它们的范围和可见性的问题

情况:

根据菜单的选择,我将不同的PHP加载到一个div中。PHP需要相同的公共数据集,我希望避免每次PHP都重新加载并保存在内存中。在下面的示例中,
GlobalVars.php
将在内存中保存两次,并且还会从数据库中获取两次数据

问题是,通过将它们加载到div中,它们不共享
main.html
的范围。
GlobalVars.php
中的全局变量可以通过
other.php
中的代码查看和访问,但不能在
PHP1.php
中,也不能在
PHP2.php
中查看和访问

GlobalVars.php:

<?php
    $var1 = "*";
    $var2 = 5;
    // Various SQL fetches
?>

Main.html:

<?php require_once="./GlobalVars.php"; ?>
<?php require_once="./another.php"; ?>

<script>
    function LoadHTML(href) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", href, false);
        xmlhttp.send();
        return xmlhttp.responseText;   
    }

    switch(menuitem) {
        case 0: break;
        case 1: document.getElementById("contentdiv").innerHTML=LoadHTML("./PHP1.php") break;
        case 2: document.getElementById("contentdiv").innerHTML=LoadHTML("./PHP2.php") break; break;
        case 3: break;
        default:
    }
</script>

函数LoadHTML(href){
var xmlhttp=new XMLHttpRequest();
open(“GET”,href,false);
xmlhttp.send();
返回xmlhttp.responseText;
}
开关(菜单项){
案例0:断裂;
案例1:document.getElementById(“contentdiv”).innerHTML=LoadHTML(“./PHP1.php”)中断;
案例2:document.getElementById(“contentdiv”).innerHTML=LoadHTML(“./PHP2.php”)break;break;
案例3:断裂;
违约:
}
PHP1.html:

<?php
    require_once="./GlobalVars.php";
    // code ...
?>

PHP2.html:

<?php
    require_once="./GlobalVars.php";
    // code ...
?>

问题是,如何将PHP加载到div中并“查看”并处理
main.html
范围内的变量

问候


Carsten

我没有通过JS加载PHP1和PHP2,而是在PHP引擎运行的早期解决了这个问题。我现在将PHP加载到不同的
DIV
s中,而不是加载到相同的
DIV
s中。这些
DIV
s的可见性随后将通过JS进行控制

变量
$LastScreen
将从SQL DB中提取,并包含显示的最后一个屏幕,以便用户获得与重新加载页面之前相同的屏幕

生成
DIV
s:

<html>
    <body>
        <div class="myclass" id="screen1"
            <?php if (strcmp($LastScreen, "screen1") !== 0) {echo " style=\"display:none; \"";} ?>
        >
            <?php require_once './PHP1.php'; ?>
        </div>
        <div class="myclass" id="screen2"
            <?php if (strcmp($LastScreen, "screen2") !== 0) {echo " style=\"display:none; \"";} ?>
            >
            <?php require_once './PHP2.php'; ?>
        </div>
    </body>
</html>

在JS中切换屏幕:

<script>
    function SwitchScreen (screen){
        var arr = document.getElementsByClassName('myclass');
        var i;
        for (i=0; i < arr.length;i++) {
            arr[i].style.display = "none";
            }
        document.getElementById(screen).style.display = "inline";

        // push screen name to SQL
        // ...
    }
</script>

功能切换屏幕(屏幕){
var arr=document.getElementsByClassName('myclass');
var i;
对于(i=0;i
问候


Carsten

它不起作用,因为javascript是在客户端执行的。php是一种服务器端语言。另外,您可以在需要php1和php2之前只需要globalvars,这样您就不必在这些文件中再次需要globalvars。@Sjoerd de Wit:实际上,我确实需要
globalvars.php
就在
main.html
的开头。但是当它到达javascripts时,PHP引擎就完成了,内存被GC释放。用JS启动另一个PHP,然后它将分配自己的变量范围(heap),而不是重复使用之前运行的PHP中的变量范围。我下面描述的解决方案现在对我有效。