在函数和变量范围内使用require的问题

时间:2009-09-22 03:53:16

标签: php scope require

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

这是我的申请流程:

  1. 启动输出缓冲区
  2. 在关联数组上调用extract()(这包含我视图的数据)
  3. 在视图文件上调用require
  4. 返回输出缓冲区的内容,并清除缓冲区
  5. echo buffer
  6. 我有一个函数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()。感谢您的回复

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

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

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

有关更多信息,您可以查看手册中的Variable scope部分,更具体地说,请参阅有关The global keyword

的小节

答案 2 :(得分:1)

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

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

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