【问题标题】:PHP: emulate the global behavior on an unknown variable inside a functionPHP:模拟函数内未知变量的全局行为
【发布时间】:2012-02-21 18:10:15
【问题描述】:

为了在我的页面中包含原始 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() 内部实际所做的更好的解决方案来实现相同的目标而没有我所说的问题,那将不胜感激!

【问题讨论】:

    标签: php variables scope global-variables


    【解决方案1】:

    您可以使用全局变量,但更稳健的方法是编写您自己的“常量数据库”。比如:

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

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

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

    在include_js里面,你可以使用

    ConstantDB::get("my_id");
    

    【讨论】:

    • 这是一个很好的答案,我已经考虑过这样做,但我宁愿使用不需要我重写一大堆代码的东西。如果没有更好的结果,我稍后会接受你的回答 =)
    【解决方案2】:

    您可以将所有全局变量(但Superglobals)导入执行包含的函数的本地范围。我认为这不是一个很好的解决方案(因为它是一把锤子),但是当您在问题中写下您不知道使用了哪些变量时,您可以将它们本地化:

    $varname = $GLOBALS['varname'];
    

    作为替代方案,您可以检查 JS 文件和/或提供文件的变量列表并将其作为数组添加到包含函数中。代码示例见another answer

    您也可以先预包含(并丢弃)js 文件,收集有关未定义变量的警告,导入它们,然后真正包含。一些more include/discard/return/variable related chunks of code

    【讨论】:

    • 我会给我的函数一个变量数组来使用。 +1 通过您的第一个示例让我发现了 extract() 函数,这真是太棒了!
    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    相关资源
    最近更新 更多