<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >来自 PHP 之外的变量</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="变量" HREF="language.variables.html"><LINK REL="PREVIOUS" TITLE="可变变量" HREF="language.variables.variable.html"><LINK REL="NEXT" TITLE="常量" HREF="language.constants.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="sect1" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="language.variables.variable.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >章 12. 变量</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="language.constants.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="language.variables.external" >来自 PHP 之外的变量</A ></H1 ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.variables.external.form" >HTML 表单(GET 和 POST)</A ></H2 ><P > 当一个表单体交给 PHP 脚本时,表单中的信息会自动在脚本中可用。有很多方法访问此信息,例如: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3815" ></A ><P ><B >例 12-9. 一个简单的 HTML 表单</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><form action="foo.php" method="POST"> Name: <input type="text" name="username"><br /> Email: <input type="text" name="email"><br /> <input type="submit" name="submit" value="Submit me!" /> </form></PRE ></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 根据特定的设置和个人的喜好,有很多种方法访问 HTML 表单中的数据。例如: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3820" ></A ><P ><B >例 12-10. 从一个简单的 POST HTML 表单访问数据</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><?php // 自 PHP 4.1.0 起可用 echo $_POST['username']; echo $_REQUEST['username']; import_request_variables('p', 'p_'); echo $p_username; // 自 PHP 3 起可用。自 PHP 5.0.0 起,这些较长的预定义变量 // 可用 register_long_arrays 指令关闭。 echo $HTTP_POST_VARS['username']; // 如果 PHP 指令 register_globals = on 时可用。不过自 // PHP 4.2.0 起默认值为 register_globals = off。 // 不提倡使用/依赖此种方法。 echo $username; ?></PRE ></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 使用 GET 表单也类似,只不过要用适当的 GET 预定义变量。GET 也适用于 QUERY_STRING(URL 中在“?”之后的信息)。因此,举例说,<TT CLASS="literal" >http://www.example.com/test.php?id=3</TT > 包含有可用 <CODE CLASS="varname" >$_GET['id']</CODE > 访问的 GET 数据。参见 <A HREF="reserved.variables.html#reserved.variables.request" >$_REQUEST</A > 和 <A HREF="function.import-request-variables.html" ><B CLASS="function" >import_request_variables()</B ></A >。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > <A HREF="language.variables.predefined.html#language.variables.superglobals" >超全局变量</A >和 <CODE CLASS="varname" >$_POST</CODE > 以及 <CODE CLASS="varname" >$_GET</CODE > 一样,自 PHP 4.1.0 起可用。 </P ></BLOCKQUOTE ></DIV ><P > 如上所示,在 PHP 4.2.0 之前 <A HREF="ini.core.html#ini.register-globals" >register_globals</A > 的默认值是 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >on</I ></SPAN >。在 PHP 3 中其值总是 on。PHP 社区鼓励大家不要依赖此指令,建议在编码时假定其为 <SPAN CLASS="emphasis" ><I CLASS="emphasis" >off</I ></SPAN >。 </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >注意: </B > <A HREF="ref.info.html#ini.magic-quotes-gpc" >magic_quotes_gpc</A > 配置指令影响到 Get,Post 和 Cookie 的值。如果打开,值 (It's "PHP!") 会自动转换成 (It\'s \"PHP!\")。数据库的插入就需要转义。参见 <A HREF="function.addslashes.html" ><B CLASS="function" >addslashes()</B ></A >,<A HREF="function.stripslashes.html" ><B CLASS="function" >stripslashes()</B ></A > 和 <A HREF="ref.sybase.html#ini.magic-quotes-sybase" >magic_quotes_sybase</A >。 </P ></BLOCKQUOTE ></DIV ><P > PHP 也懂得表单变量上下文中的数组(参见<A HREF="faq.html.html" >相关常见问题</A >)。例如可以将相关的变量编成组,或者用此特性从多选输入框中取得值。例如,将一个表单 POST 给自己并在提交时显示数据: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3846" ></A ><P ><B >例 12-11. 更复杂的表单变量</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">if (isset(</font><font color="#0000BB">$_POST</font><font color="#007700">[</font><font color="#DD0000">'action'</font><font color="#007700">]) && </font><font color="#0000BB">$_POST</font><font color="#007700">[</font><font color="#DD0000">'action'</font><font color="#007700">] == </font><font color="#DD0000">'submitted'</font><font color="#007700">) {<br /> echo </font><font color="#DD0000">'<pre>'</font><font color="#007700">;<br /><br /> </font><font color="#0000BB">print_r</font><font color="#007700">(</font><font color="#0000BB">$_POST</font><font color="#007700">);<br /> echo </font><font color="#DD0000">'<a href="'</font><font color="#007700">. </font><font color="#0000BB">$_SERVER</font><font color="#007700">[</font><font color="#DD0000">'PHP_SELF'</font><font color="#007700">] .</font><font color="#DD0000">'">Please try again</a>'</font><font color="#007700">;<br /><br /> echo </font><font color="#DD0000">'</pre>'</font><font color="#007700">;<br />} else {<br /></font><font color="#0000BB">?><br /></font><form action="<font color="#0000BB"><?php </font><font color="#007700">echo </font><font color="#0000BB">$_SERVER</font><font color="#007700">[</font><font color="#DD0000">'PHP_SELF'</font><font color="#007700">]; </font><font color="#0000BB">?></font>" method="post"><br /> Name: <input type="text" name="personal[name]"><br /><br /> Email: <input type="text" name="personal[email]"><br /><br /> Beer: <br><br /> <select multiple name="beer[]"><br /> <option value="warthog">Warthog</option><br /> <option value="guinness">Guinness</option><br /> <option value="stuttgarter">Stuttgarter Schwabenbr</option><br /> </select><br /><br /> <input type="hidden" name="action" value="submitted" /><br /> <input type="submit" name="submit" value="submit me!" /><br /></form><br /><font color="#0000BB"><?php<br /></font><font color="#007700">}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > 在 PHP 3 中,变量使用中的数组仅限于一维数组。在 PHP 4 中,没有此种限制。 </P ><DIV CLASS="sect3" ><H3 CLASS="sect3" ><A NAME="language.variables.external.form.submit" >IMAGE SUBMIT 变量名</A ></H3 ><P > 当提交表单时,可以用一幅图像代替标准的提交按钮,用类似这样的标记: </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3853" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="html" ><input type="image" src="image.gif" name="sub" /></PRE ></TD ></TR ></TABLE ><P ></P ></DIV ><P > 当用户点击到图像中的某处时,相应的表单会被传送到服务器,并加上两个变量 sub_x 和 sub_y。它们包含了用户点击图像的坐标。有经验的用户可能会注意到被浏览器发送的实际变量名包含的是一个点而不是下划线(即 sub.x 和 sub.y),但 PHP 自动将点转换成了下划线。 </P ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.variables.external.cookies" >HTTP Cookies</A ></H2 ><P > PHP 透明地支持 <A HREF="http://wp.netscape.com/newsref/std/cookie_spec.html" TARGET="_top" >Netscape 规范</A >定义中的 HTTP cookies。Cookies 是一种在远端浏览器端存储数据并能追踪或识别再次访问的用户的机制。可以用 <A HREF="function.setcookie.html" ><B CLASS="function" >setcookie()</B ></A > 函数设定 cookies。Cookies 是 HTTP 信息头中的一部分,因此 SetCookie 函数必须在向浏览器发送任何输出之前调用。对于 <A HREF="function.header.html" ><B CLASS="function" >header()</B ></A > 函数也有同样的限制。Cookie 数据会在相应的 cookie 数据数组中可用,例如 <CODE CLASS="varname" >$_COOKIE</CODE >,<CODE CLASS="varname" >$HTTP_COOKIE_VARS</CODE > 和 <CODE CLASS="varname" >$_REQUEST</CODE >。更多细节和例子见 <A HREF="function.setcookie.html" ><B CLASS="function" >setcookie()</B ></A > 手册页面。 </P ><P > 如果要将多个值赋给一个 cookie 变量,必须将其赋成数组。例如: </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3867" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /> setcookie</font><font color="#007700">(</font><font color="#DD0000">"MyCookie[foo]"</font><font color="#007700">, </font><font color="#DD0000">'Testing 1'</font><font color="#007700">, </font><font color="#0000BB">time</font><font color="#007700">()+</font><font color="#0000BB">3600</font><font color="#007700">);<br /> </font><font color="#0000BB">setcookie</font><font color="#007700">(</font><font color="#DD0000">"MyCookie[bar]"</font><font color="#007700">, </font><font color="#DD0000">'Testing 2'</font><font color="#007700">, </font><font color="#0000BB">time</font><font color="#007700">()+</font><font color="#0000BB">3600</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><P > 这将会建立两个单独的 cookie,尽管 MyCookie 在脚本中是一个单一的数组。如果想在仅仅一个 cookie 中设定多个值,考虑先在值上使用 <A HREF="function.serialize.html" ><B CLASS="function" >serialize()</B ></A > 或 <A HREF="function.explode.html" ><B CLASS="function" >explode()</B ></A >。 </P ><P > 注意在浏览器中一个 cookie 会替换掉上一个同名的 cookie,除非路径或者域不同。因此对于购物车程序可以保留一个计数器并一起传递,例如: </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3873" ></A ><P ><B >例 12-12. 一个 <A HREF="function.setcookie.html" ><B CLASS="function" >setcookie()</B ></A > 的示例</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">if (isset(</font><font color="#0000BB">$_COOKIE</font><font color="#007700">[</font><font color="#DD0000">'count'</font><font color="#007700">])) {<br /> </font><font color="#0000BB">$count </font><font color="#007700">= </font><font color="#0000BB">$_COOKIE</font><font color="#007700">[</font><font color="#DD0000">'count'</font><font color="#007700">] + </font><font color="#0000BB">1</font><font color="#007700">;<br />} else {<br /> </font><font color="#0000BB">$count </font><font color="#007700">= </font><font color="#0000BB">1</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">setcookie</font><font color="#007700">(</font><font color="#DD0000">'count'</font><font color="#007700">, </font><font color="#0000BB">$count</font><font color="#007700">, </font><font color="#0000BB">time</font><font color="#007700">()+</font><font color="#0000BB">3600</font><font color="#007700">);<br /></font><font color="#0000BB">setcookie</font><font color="#007700">(</font><font color="#DD0000">"Cart</font><font color="#007700">[</font><font color="#DD0000">$count</font><font color="#007700">]</font><font color="#DD0000">"</font><font color="#007700">, </font><font color="#0000BB">$item</font><font color="#007700">, </font><font color="#0000BB">time</font><font color="#007700">()+</font><font color="#0000BB">3600</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.variables.external.dot-in-names" >变量名中的点</A ></H2 ><P > 通常,PHP 不会改变传递给脚本中的变量名。然而应该注意到点(句号)不是 PHP 变量名中的合法字符。至于原因,看看: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$varname</font><font color="#007700">.</font><font color="#0000BB">ext</font><font color="#007700">; </font><font color="#FF8000">/* 非法变量名 */<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE > 这时,解析器看到是一个名为 <CODE CLASS="varname" >$varname</CODE > 的变量,后面跟着一个字符串连接运算符,后面跟着一个裸字符串(即没有加引号的字符串,且不匹配任何已知的健名或保留字)'ext'。很明显这不是想要的结果。 </P ><P > 出于此原因,要注意 PHP 将会自动将变量名中的点替换成下划线。 </P ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.variables.determining-type-of" >确定变量类型</A ></H2 ><P > 因为 PHP 会判断变量类型并在需要时进行转换(通常情况下),因此在某一时刻给定的变量是何种类型并不明显。PHP 包括几个函数可以判断变量的类型,例如:<A HREF="function.gettype.html" ><B CLASS="function" >gettype()</B ></A >,<A HREF="function.is-array.html" ><B CLASS="function" >is_array()</B ></A >,<A HREF="function.is-float.html" ><B CLASS="function" >is_float()</B ></A >,<A HREF="function.is-int.html" ><B CLASS="function" >is_int()</B ></A >,<A HREF="function.is-object.html" ><B CLASS="function" >is_object()</B ></A > 和 <A HREF="function.is-string.html" ><B CLASS="function" >is_string()</B ></A >。参见<A HREF="language.types.html" >类型</A >一章。 </P ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="language.variables.variable.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="language.constants.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >可变变量</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="language.variables.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >常量</TD ></TR ></TABLE ></DIV ></BODY ></HTML >