<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.variables.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'language.variables.external.php',
    1 => '来自 PHP 之外的变量',
    2 => '来自 PHP 之外的变量',
  ),
  'up' => 
  array (
    0 => 'language.variables.php',
    1 => '变量',
  ),
  'prev' => 
  array (
    0 => 'language.variables.variable.php',
    1 => '可变变量',
  ),
  'next' => 
  array (
    0 => 'language.constants.php',
    1 => '常量',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'language/variables.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.variables.external" class="sect1">
   <h2 class="title">来自 PHP 之外的变量</h2>

   <div class="sect2" id="language.variables.external.form">
    <h3 class="title">HTML 表单（GET 和 POST）</h3>

    <p class="simpara">
     当一个表单提交给 PHP
     脚本时，表单中的信息会自动在脚本中可用。有几个方法访问此信息，例如：
    </p>

    <p class="para">
     <div class="example" id="example-1">
      <p><strong>示例 #1 一个简单的 HTML 表单</strong></p>
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form action=&quot;foo.php&quot; method=&quot;POST&quot;&gt;
    Name:  &lt;input type=&quot;text&quot; name=&quot;username&quot;&gt;&lt;br /&gt;
    Email: &lt;input type=&quot;text&quot; name=&quot;email&quot;&gt;&lt;br /&gt;
    &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Submit me!&quot; /&gt;
&lt;/form&gt;</pre>
</div>
      </div>

     </div>
    </p>

    <p class="para">
     只有两种方法可以访问 HTML
     表单中的数据。以下列出了当前有效的方法：
    </p>

    <p class="para">
     <div class="example" id="example-2">
      <p><strong>示例 #2 从简单的 POST HTML 表单访问数据</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">$_REQUEST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
    </p>

    <p class="para">
     使用 GET 表单也类似，只不过要用适当的 GET 预定义变量。GET
     也适用于
     <code class="literal">QUERY_STRING</code>（URL
     中在“?”之后的信息）。因此，举例说，<code class="literal">http://www.example.com/test.php?id=3</code>
     包含有可用 <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['id']</a></var>
     来访问的 GET 数据。参见
     <a href="reserved.variables.request.php" class="link">$_REQUEST</a>。
    </p>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <p class="para">
      变量名中的点和空格被转换成下划线。例如
      <code class="literal">&lt;input name=&quot;a.b&quot; /&gt;</code> 变成了
      <code class="literal">$_REQUEST[&quot;a_b&quot;]</code>。
     </p>
    </p></blockquote>

    <p class="simpara">
     PHP 也理解表单变量上下文中的数组（参见<a href="faq.html.php" class="link">相关常见问题</a>）。例如可以将相关的变量编成组，或者用此功能从多选输入框中取得值。例如，将表单
     POST 给自己并在提交时显示数据：
    </p>

    <p class="para">
     <div class="example" id="example-3">
      <p><strong>示例 #3 更复杂的表单变量</strong></p>
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'&lt;pre&gt;'</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">));<br />    echo </span><span style="color: #DD0000">'&lt;/pre&gt;'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;<br /></span>&lt;form action="" method="post"&gt;<br />    Name:  &lt;input type="text" name="personal[name]" /&gt;&lt;br /&gt;<br />    Email: &lt;input type="text" name="personal[email]" /&gt;&lt;br /&gt;<br />    Beer: &lt;br /&gt;<br />    &lt;select multiple name="beer[]"&gt;<br />        &lt;option value="warthog"&gt;Warthog&lt;/option&gt;<br />        &lt;option value="guinness"&gt;Guinness&lt;/option&gt;<br />        &lt;option value="stuttgarter"&gt;Stuttgarter Schwabenbräu&lt;/option&gt;<br />    &lt;/select&gt;&lt;br /&gt;<br />    &lt;input type="submit" value="submit me!" /&gt;<br />&lt;/form&gt;</span></code></div>
      </div>

     </div>
    </p>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <span class="simpara">
      如果外部变量名以有效的数组语法开头，则将会忽略尾随字符。例如，<code class="literal">&lt;input name=&quot;foo[bar]baz&quot;&gt;</code>
      变为 <code class="literal">$_REQUEST[&#039;foo&#039;][&#039;bar&#039;]</code>。
     </span>
    </p></blockquote>

    <div class="sect3" id="language.variables.external.form.submit">
     <h4 class="title">IMAGE SUBMIT 变量名</h4>

     <p class="simpara">
      当提交表单时，可以用一幅图像代替标准的提交按钮，用类似这样的标记：
     </p>

     <div class="informalexample">
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input type=&quot;image&quot; src=&quot;image.gif&quot; name=&quot;sub&quot; /&gt;</pre>
</div>
      </div>

     </div>

     <p class="simpara">
      当用户点击到图像中的某处时，相应的表单会被传送到服务器，并加上两个变量
      <var class="varname">sub_x</var> 和
      <var class="varname">sub_y</var>。它们包含了用户点击图像的坐标。有经验的用户可能会注意到被浏览器发送的实际变量名包含的是一个点而不是下划线（即
      sub.x 和 sub.y），但 PHP 自动将点转换成了下划线。
     </p>
    </div>

   </div>

   <div class="sect2" id="language.variables.external.cookies">
    <h3 class="title">HTTP Cookie</h3>

    <p class="simpara">
     PHP 透明地支持 <a href="https://datatracker.ietf.org/doc/html/rfc6265" class="link external">&raquo;&nbsp;RFC 6265</a>定义中的
     HTTP cookies。Cookies
     是一种在远端浏览器端存储数据并能追踪或识别再次访问的用户的机制。可以用
     <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>
     函数设定 cookies。Cookies 是
     HTTP 信息头中的一部分，因此
     SetCookie 函数必须在向浏览器发送任何输出之前调用。对于
     <span class="function"><a href="function.header.php" class="function">header()</a></span> 函数也有同样的限制。Cookie
     数据会在相应的 cookie 数据数组中可用，例如
     <var class="varname"><a href="reserved.variables.cookies.php" class="classname">$_COOKIE</a></var> 和
     <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var>。更多细节和例子见
     <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> 手册页面。
    </p>

    <blockquote class="note"><p><strong class="note">注意</strong>: 
     <span class="simpara">
      自 PHP 7.2.34、7.3.23 和 7.4.11 起，出于安全原因，传入 cookie 的
      <em>name</em> 不再进行 url 解码。
     </span>
    </p></blockquote>

    <p class="simpara">
     如果要将多个值赋给单个 cookie 变量，可以将其赋成数组。例如：
    </p>

    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />  setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MyCookie[foo]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Testing 1'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br />  </span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MyCookie[bar]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Testing 2'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

    <p class="simpara">
     尽管 <var class="varname">MyCookie</var> 在脚本中是单个数组，这将会建立两个单独的 cookie。如果只需为一个 cookie
     设定多个值，考虑先在值上使用 <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span> 或 <span class="function"><a href="function.explode.php" class="function">explode()</a></span>。
    </p>

    <p class="simpara">
     注意，除非路径或者域不同，cookie 将替换浏览器中先前的同名
     cookie。因此对于购物车程序，可以保留一个计数器并一起传递，即
    </p>

    <div class="example" id="example-4">
     <p><strong>示例 #4 一个 <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> 的示例</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (isset(</span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">] + </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">'count'</span><span style="color: #007700">, </span><span style="color: #0000BB">$count</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"Cart[</span><span style="color: #0000BB">$count</span><span style="color: #DD0000">]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$item</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">()+</span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>

   </div>

   <div class="sect2" id="language.variables.external.dot-in-names">
    <h3 class="title">变量名中的点</h3>

    <p class="para">
     通常，PHP 不会改变传递给脚本中的变量名。然而应该注意到点（句号）不是
     PHP 变量名中的合法字符。至于原因，看看：
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$varname</span><span style="color: #007700">.</span><span style="color: #0000BB">ext</span><span style="color: #007700">;  </span><span style="color: #FF8000">/* 非法变量名 */<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     这时，解析器看到是一个名为
     <var class="varname">$varname</var>
     的变量，后面跟着一个字符串连接运算符，后面跟着一个裸字符串（即没有加引号的字符串，且不匹配任何已知的健名或保留字）&#039;ext&#039;。很明显这不是想要的结果。
    </p>

    <p class="para">
     出于此原因，要注意 PHP
     将会自动将变量名中的点替换成下划线。
    </p>

   </div>

   <div class="sect2" id="language.variables.determining-type-of">
    <h3 class="title">确定变量类型</h3>

    <p class="para">
     因为 PHP 会判断变量类型并在需要时进行转换（通常情况下），因此在某一时刻给定的变量是何种类型并不明显。PHP
     包括几个函数可以判断变量的类型，例如：<span class="function"><a href="function.gettype.php" class="function">gettype()</a></span>，<span class="function"><a href="function.is-array.php" class="function">is_array()</a></span>，<span class="function"><a href="function.is-float.php" class="function">is_float()</a></span>，<span class="function"><a href="function.is-int.php" class="function">is_int()</a></span>，<span class="function"><a href="function.is-object.php" class="function">is_object()</a></span>
     和 <span class="function"><a href="function.is-string.php" class="function">is_string()</a></span>。参见<a href="language.types.php" class="link">类型</a>一章。
    </p>
    <p class="para">
     HTTP 是一种文本协议，大多数（可能不是全部）<a href="language.variables.superglobals.php" class="link">超全局数组</a>中的内容（如
     <var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var> 和 <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET</a></var>）将保留为字符串。PHP 不会尝试将值转换为特定类型。在下面的示例中，<var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var1"]</a></var>
     将包含字符串“null”，而 <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var2"]</a></var> 将包含字符串“123”。
     <div class="example-contents">
<div class="cdata"><pre>
/index.php?var1=null&amp;var2=123
</pre></div>
      </div>

    </p>
   </div>
   
   <div class="sect2" id="language.variables.external.changelog">
    <h3 class="title">更新日志</h3>

    <p class="para">
     <table class="doctable informaltable">
      
       <thead>
        <tr>
         <th>版本</th>
         <th>说明</th>
        </tr>

       </thead>

       <tbody class="tbody">
        <tr>
         <td>7.2.34, 7.3.23, 7.4.11</td>
         <td>
            出于安全原因，传入 cookie 的 <em>name</em> 不再进行 URL 解码。
         </td>
        </tr>

       </tbody>
      
     </table>

    </p>
   </div>
  </div><?php manual_footer($setup); ?>