我正在使用MVC设置,我正在尝试将javascript注入我的视图(.php),但允许javascript访问视图可以访问的所有变量。我的最终目标是能够从我的javascript访问PHP变量(例如,我可以alert()
一个产品的名称。)
这是我的申请流程:
我有一个函数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()
。感谢您的回复
答案 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
关键字将允许您执行此操作。但是,尽量避免使用全局变量,因为这会导致问题。