为了将原始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");