PHP:模拟函数内部未知变量的全局行为


PHP: emulate the global behavior on an unknown variable inside a function

为了将原始JavaScript文件包含到我的页面中,我最终使用了:

function include_js($jsfile, $basepath = JSPATH){
    echo '<script type="text/javascript">';
    include($basepath . $jsfile);
    echo '</script>';
}

运行良好,这些JS文件中的PHP代码仍然运行良好,这里没有问题。但这里有一些我以前使用的伪代码:

<script>
    var hello = '<?php echo $id; ?>';
</script>

所以,问题来了:

  • 以前,我的JavaScript文件中使用的PHP代码是在与页面相同的上下文中执行的
  • 现在,它是在include_js()函数的上下文中执行的

因此,我再也无法访问页面的任何变量了。我可以用global $id;修复它,但那是伪代码。

事实上,我不知道我需要访问哪些变量。

知道如何解决那个问题吗?如果你有一个比我在include_js()中实际做的更好的解决方案,在没有我所说的问题的情况下实现同样的目标,那将不胜感激!

您可以将所有全局变量(但超级全局变量除外)导入到执行include的函数的本地作用域中。我不认为这真的是一个好的解决方案(因为它是一把锤子),但当你在问题中写作时,你不知道使用了哪些变量,所以你可以将它们本地化为:

$varname = $GLOBALS['varname'];

作为替代方案,您可以检查JS文件和/或提供文件的变量列表,并将其作为数组添加到include函数中。有关一些代码示例,请参阅另一个答案。

您还可以首先预包含(并丢弃)js文件,收集关于未定义变量的警告,导入它们,然后真正包含。还有一些包含/丢弃/返回/变量相关的代码块。

您可以使用全局变量,但更健壮的方法是编写自己的"常量数据库"。类似于:

class ConstantDB{
    public static function set($key, $value){
    }
    public static function get($key){
    }
}

在很多情况下,它只是非常方便。对于您的特定情况,您可以使用

ConstantDB::set("my_id", $id);

在include.js中,您可以使用

ConstantDB::get("my_id");