## 来自PHP之外的变量
### HTML表单(GET和POST)
当一个表单提交给PHP脚本时,表单中的信息会自动在脚本中可用。有很多方法访问此信息,例如:
**Example #1 一个简单的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>
~~~
根据特定的设置和个人的喜好,有很多种方法访问 HTML 表单中的数据。例如:
**Example #2 从一个简单的 POST HTML 表单访问数据**
~~~
<?php
// 自 PHP 4.1.0 起可用
echo $_POST['username'];
echo $_REQUEST['username'];
import_request_variables('p', 'p_');
echo $p_username;
// 自 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;
?>
~~~
使用 GET 表单也类似,只不过要用适当的 GET 预定义变量。GET 也适用于 *QUERY\_STRING*(URL 中在“?”之后的信息)。因此,举例说,*http://www.example.com/test.php?id=3* 包含有可用 [$\_GET\['id'\]](http://php.net/manual/zh/reserved.variables.get.php) 来访问的 GET 数据。
> Note:超全局数组例如:$_POST和$_GET,自PHP4.1.0起可用。
> Note:变量名中的点和空格被转换成下划线。例如 ** 变成了 *$\_REQUEST\["a\_b"\]*。
如上所示,在 PHP 4.2.0 之前 [register\_globals](http://php.net/manual/zh/ini.core.php#ini.register-globals) 的默认值是 *on*。PHP 社区鼓励大家不要依赖此指令,建议在编码时假定其为 *off*。
**Example #3 更复杂的表单变量**
```
<?php
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
echo '<pre>';
print_r($_POST);
echo '<a href="'. $_SERVER['PHP_SELF'] .'">Please try again</a>';
echo '</pre>';
} else {
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Name: <input type="text" name="personal[name]"><br />
Email: <input type="text" name="personal[email]"><br />
Beer: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbr</option>
</select><br />
<input type="hidden" name="action" value="submitted" />
<input type="submit" name="submit" value="submit me!" />
</form>
<?php
}
?>
```
#### IMAGE SUBMIT 变量名
当提交表单时,可以用一幅图像代替标准的提交按钮,用类似这样的标记:
~~~
<input type="image" src="image.gif" name="sub" />
~~~
当用户点击到图像中的某处时,相应的表单会被传送到服务器,并加上两个变量 sub\_x 和 sub\_y。它们包含了用户点击图像的坐标。有经验的用户可能会注意到被浏览器发送的实际变量名包含的是一个点而不是下划线(即 sub.x 和 sub.y),但 PHP 自动将点转换成了下划线。
### HTTP Cookies
PHP 透明地支持 [» RFC 6265](http://www.faqs.org/rfcs/rfc6265)定义中的 HTTP cookies。Cookies 是一种在远端浏览器端存储数据并能追踪或识别再次访问的用户的机制。可以用 [setcookie()](http://php.net/manual/zh/function.setcookie.php) 函数设定 cookies。Cookies 是 HTTP 信息头中的一部分,因此 SetCookie 函数必须在向浏览器发送任何输出之前调用。对于 [header()](http://php.net/manual/zh/function.header.php) 函数也有同样的限制。Cookie 数据会在相应的 cookie 数据数组中可用,例如 [$\_COOKIE](http://php.net/manual/zh/reserved.variables.cookies.php),$HTTP\_COOKIE\_VARS 和 [$\_REQUEST](http://php.net/manual/zh/reserved.variables.request.php)。更多细节和例子见 [setcookie()](http://php.net/manual/zh/function.setcookie.php) 手册页面。
如果要将多个值赋给一个 cookie 变量,必须将其赋成数组。例如:
```
<?php
setcookie("MyCookie[foo]",'Testing 1', time()+3600);
setcookie("MyCookie[bar]",'Testing 2', time()+3600);
?>
```
这将会建立两个单独的cookie,尽管MyCookie在脚本中是一个单一的数组。如果想在仅仅一个cookie中设定多个值,考虑先在值上使用[serialize()](http://php.net/manual/zh/function.serialize.php) 或 [explode()](http://php.net/manual/zh/function.explode.php)。
注意在浏览器中一个cookie会替换掉一个同名的cookie,除非路径或者域不同。因此对于购物车程序可以保留一个计数器并一起传递,例如:
**Example #4 一个**[setcookie()](http://php.net/manual/zh/function.setcookie.php) 的示例****
```
<?php
if(isset($_COOKIE['count'])){
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}
setcookie('count',$count,time()+3600);
setcookie("Cart[$count]",$item,time()+3600);
```
### 变量名中的点
通常,PHP不会改变传递给脚本中的变量名。然而应该注意到点(句号)不是PHP变量名中的合法字符。至于原因,看看:
```
<?php
$varname.ext; /* 非法变量名 */
?>
```
这时,解析器看到是一个名为$varname的变量,后面跟着一个字符串连接运算符,后面跟着一个裸字符串(即没有加引号的字符串,且不匹配任何已知的键名或保留字)'ext'。很明显这不是想要的结果。
出于此原因,要注意PHP将会自动将变量名中的点替换成下划线。
### 确定变量类型
因为PHP会判断变量类型并在需要时进行转换(通常情况下),因此在某一时刻给定的变量是何种类型并不明显。PHP包含几个函数可以判断变量的类型,例如:[gettype()](http://php.net/manual/zh/function.gettype.php),[is\_array()](http://php.net/manual/zh/function.is-array.php),[is\_float()](http://php.net/manual/zh/function.is-float.php),[is\_int()](http://php.net/manual/zh/function.is-int.php),[is\_object()](http://php.net/manual/zh/function.is-object.php) 和 [is\_string()](http://php.net/manual/zh/function.is-string.php)。参见[类型](http://php.net/manual/zh/language.types.php)一章。
- 序言
- 简介
- PHP是什么?
- PHP能做什么?
- 基本语法
- 类型
- boolean(布尔型)
- integer(整型)
- float(浮点型)
- string(字符串)
- array(数组)
- object(对象)
- callable(可调用)
- resource(资源)
- NULL(无类型)
- 伪类型
- 类型转换的判别
- 变量
- 基础
- 预定义变量
- 变量范围
- 可变变量
- 来自PHP之外的变量
- 常量
- 语法
- 魔术常量
- 表达式
- 运算符
- 运算符优先级
- 算术运算符
- 赋值运算符
- 位运算符
- 比较运算符
- 错误控制运算符
- 执行运算符
- 递增/递减运算符
- 逻辑运算符
- 字符串运算符
- 数组运算符
- 类型运算符
- 流程控制
- if
- else
- elseif/else if
- 流程控制的替代语法
- while
- do-whille
- for
- foreach
- break
- continue
- switch
- declare
- return
- require
- include
- require_once
- include_once
- goto
- 函数
- 用户自定义函数
- 函数的参数
- 返回值
- 可变函数
- 内部 (内置)函数
- 匿名函数
- 类与对象
- 简介
- 基本概念
- 属性
- 类的自动加载
- 构造函数
- 访问控制(可见性)