代码之家  ›  专栏  ›  技术社区  ›  Steven Mercatante Dimitri Kopriwa

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

  •  0
  • Steven Mercatante Dimitri Kopriwa  · 技术社区  · 15 年前

    我使用的是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 手工陈述,一切正常。是我试图通过使用 注入J() 可能吗?

    编辑
    我忘记提到我确实尝试将变量显式传递给 注入J() 它确实有效,但我不想总是传递变量。如果视图需要将许多变量传递给JS,那么它可能会变得混乱和麻烦。是否有一种方法可以(在函数内)获取负责调用 注入J() ?

    编辑2
    再考虑一下,再次传递变量是 一个真正的问题,我认为我只是贪婪/懒惰;)。我只会在需要时传递变量 注入J() . 谢谢你的回复

    3 回复  |  直到 15 年前
        1
  •  2
  •   meder omuraliev    15 年前

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

    function globalJs( $filename, $product ) {
        include $filename;
    }
    
    globalJs( 'foo.js', array( 'name' => 'test' ) );
    
        2
  •  2
  •   Pascal MARTIN    15 年前

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

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

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

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

        3
  •  1
  •   Fragsworth    15 年前

    这将很好地工作,但是您的范围问题是由于函数中不存在变量造成的。试试这个:

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

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