【问题标题】:Problem with using require inside a function and variable scope在函数和变量范围内使用 require 的问题
【发布时间】:2010-11-30 06:59:21
【问题描述】:

我正在使用 MVC 设置并尝试将 javascript 注入我的视图 (.php),但允许 javascript 访问视图可以访问的所有变量。我的最终目标是能够从我的 javascript 访问 PHP 变量(例如,我可以 alert() 产品名称)。

这是我的申请流程:

  1. 启动输出缓冲区
  2. 在关联数组上调用 extract()(其中包含我的视图的数据)
  3. 在视图文件上调用 require
  4. 返回输出缓冲区的内容,并清空缓冲区
  5. 回声缓冲区

我有一个函数injectJS(),如下:

function injectJS($jsFile) {
 require APP_DIR . $jsFile;
}

这是我要注入的 Javascript (alert.js) 示例:

 <script type="text/javascript">
     alert("product name: <?php echo $product['name']; ?>");
 </script>

因此,在我的视图文件中,我调用injectJS('alert.js');。它注入了 javascript,但是当我渲染视图时,我收到一个 PHP 通知,指出有一个未定义的变量 $product。但是,如果我手动编写 require 语句,一切正常。我想通过使用injectJS() 来实现什么可能?

编辑
我忘了提到我确实尝试将变量显式传递给injectJS(),它确实有效,但我不想总是传递变量。如果视图需要将许多变量传递给 JS,它可能会变得混乱和繁琐。有没有办法(在函数内)获取负责调用 injectJS() 的脚本范围内的变量?

编辑 2
再想一想,再次传递变量 不是 一个真正的问题,我想我只是贪婪/懒惰;)。我只会在需要时将变量传递给injectJS()。感谢回复

【问题讨论】:

  • 你不能传递一个包含包括 $products 在内的所有内容的大数组吗?还是您认为这仍然很混乱?

标签: php scope require


【解决方案1】:

将 $product 传递给您的函数,它将在函数体内可见,或在内部定义:

function globalJs( $filename, $product ) {
    include $filename;
}

globalJs( 'foo.js', array( 'name' => 'test' ) );

【讨论】:

    【解决方案2】:

    在 PHP 中,变量在函数内部是不可见的,除非作为参数传递,或者声明为 global

    您似乎遇到的问题是 $product 变量在 injectJS 函数中不存在;如果它是在该函数之外创建的全局变量,则应将其作为参数传递,或在函数开头将其声明为全局变量:

    function injectJS($jsFile) {
        global $product;
        require APP_DIR . $jsFile;
    }
    

    有关更多信息,您可以查看手册中的 Variable scope 部分,更具体地说,是关于 The global keyword 的小节

    【讨论】:

      【解决方案3】:

      这可以正常工作,但您的范围问题是由于您的函数中不存在该变量。试试这个:

      function injectJS($jsFile) {
          $product = array('name' => 'test');
          require APP_DIR . $jsFile;
      }
      

      在某些时候,您必须在函数的范围内定义变量。如果变量全局存在,PHP global 关键字将允许您执行此操作。不过,请尽量避免使用全局变量,因为这会导致问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-20
        • 2012-06-06
        • 2011-06-11
        • 2021-12-30
        • 1970-01-01
        • 2020-07-31
        • 2012-10-04
        • 2016-10-26
        相关资源
        最近更新 更多