使用Javascript的PHP - <script> </script>标记内的PHP变量的范围是什么?

时间:2011-11-06 04:02:16

标签: php javascript scope

我正在尝试混合使用php和javascript,因为我的javascript需要在页面加载时访问一些php变量。我无法理解某些内容,而且我已经编写了一个代码示例。

<?php
session_start();
$test = 100;
$_SESSION['test'] = 200;
?>
<html>
<head>
<title>Test This Out</title>
</head>
<body>
<h1> Testing Javascript and PHP Mixed </h1>
<p>
<?php 
echo("The value of \$test is $test and the value of \$_SESSION['test'] is ");
?>
</p>
<p>
<script type="text/javascript">
<?php 
session_start();
if(isset($test)) echo("document.write('Non-session variable exists and is $test <br />');"); 
else echo("document.write('Non-session variable does not exist<br />');");
if(isset($_SESSION['test'])) echo("document.write('Session variable exists <br />');"); 
else echo("document.write('Session variable does not exist<br />');");
?>
</script>
</p>
</body>
</html>

输出如下:

Testing Javascript and PHP Mixed

The value of $test is 100 and the value of $_SESSION['test'] is

Non-session variable exists and is 100
Session variable exists 

所以我试图了解脚本可用的php变量类型。似乎我称之为$ test的变量是可用的,但即使它知道

$_SESSION['test'] 

存在,如果我尝试输出该值(与输出

的方式完全相同)
$test

变量),整个系统挂起。

我的问题是:  1. javascript中使用的php可以“看到”我之前在页面中定义的变量吗?  2.为什么我试图打印

$_SESSION['test'] 

变量使整个事件崩溃(什么都没有渲染)?  3.是第二个

session_start(), 

脚本中的那个,必要吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

PHP在服务器上运行,Javascript在客户端上运行。它们具有完全不同的执行环境,并且在完全不同的时间执行。 PHP变量具有PHP的变量范围,而JS规则不能进入游戏,因为PHP没有在“JS环境”中执行。那是不可能的。

您可以拥有PHP GENERATE JS代码/变量,但这些变量不会被JS引擎处理/执行/验证,直到 AFTER 生成页面为止PHP并发送到客户端浏览器。

您也可以将JS“发送”变量发送到PHP,但这是通过AJAX调用完成的,并且JS再次在客户端浏览器中运行,并且PHP在Web服务器上运行。就PHP而言,AJAX调用只是一个常规的HTTP请求,当响应回到浏览器中运行的JS时,它就像来自服务器的任何其他HTTP响应一样。

您的第二个session_start()将失败 - 必须在服务器生成任何输出之前启动会话,因为会话ID令牌作为常规HTTP cookie发送到客户端浏览器。每当脚本产生任何输出时,PHP都会自动发送完整的HTTP标头,并且在执行第二个session_start()之前输出HTML页面的开头和一些JS代码。

如果你有这样的事情:

<script type="text/javascript">
var jsvar = <?php echo $phpvar; ?>;
</script>

就PHP引擎而言,这是完全有效的PHP代码,并且它将输出$phpvar的任何内容。但请记住 - PHP正在服务器上运行 - PHP引擎不知道您将该变量输出到的环境中。它不知道它在javascript块中,它只知道它应该输出变量的内容。如果此时没有定义$ phpvar,那么你实际上会产生:

var jsvar = ;

这是一个语法错误。完全由来确保您使用PHP生成有效的 JAVASCRIPT code.l

答案 1 :(得分:0)

现在你的代码是procedural,这意味着它将按顺序从第1行运行到EOF,b / c你没有进行任何自定义函数调用等。

您不需要第二个session_start(),第一个就足以初始化会话。

尝试var转储会话变量时,从未听说过系统挂起。也许尝试这种格式(单引号而不是双引号):

echo('The value of $test is ' . $test . ' and the value of $_SESSION[test] is ' . $_SESSION['test']);