0

我正在使用 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');. $product它注入了 javascript,但是当我渲染视图时,我收到一个 PHP 通知,指出有一个未定义的变量。但是,如果我手动编写require语句,一切正常。我试图通过使用来实现的目标是什么injectJS()

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

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

4

3 回答 3

2

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

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

globalJs( 'foo.js', array( 'name' => 'test' ) );
于 2009-09-22T03:59:00.753 回答
2

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

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

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

有关更多信息,您可以查看手册中的变量范围部分,更具体地说,有关全局关键字的小节

于 2009-09-22T03:59:33.077 回答
1

这会很好,但是您的范围问题是由于您的函数中不存在该变量。试试这个:

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

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

于 2009-09-22T04:00:56.303 回答