PHP语法总结
以下内容总结自http://php.net/manual/zh/
- 基本语法
- 从HTML中分离:
- 大多数情况下 PHP 都是嵌入在 HTML 文档中的
- 高级分离技术:
PHP遇到?>结束符号后会直接打印下面的内容
<?php
if ($expression) {
?>
<strong>This is true.</strong>
<?php
} else {
?>
<strong>This is false.</strong>
<?php
}
?>
- 指令分隔符:用分号
- 注释:/*……*/ 或//
- 类型
- 支持的类型
- boolean、integer、float、string四种标准型,array、object两种复合型,还有Resource、NULL、callable三种特殊类型
- 在调试时使用var_dump查看关于变量的所有信息,(会将对象全部属性展开打印出来)和他相同的还有print_r() 显示关于一个变量的易于理解的信息。
- 类型转换
- $foo = (int)$bar;
- 或settype($foo, "integer");
- 判断是否是某个类型
- 使用is_int( )、is_string()等
- if (is_int($an_int)){…..}
- 得到类型:gettype()
- 基本变量的一些参考
- PHP_INT_SIZE表示int的字长
- PHP_INT_MAX表示int的最大值
- 当从浮点数转换成整数时,将向零取整。
- 字符串
- unicode编码:使用 utf8_encode()和 utf8_decode()
- 单引号:所有的字符原样输出,单引号本身用\转义
- 双引号:支持转义字符,双引号中间的变量会被替换成值,可用花括号明确表明界限
"He drank some {$beer}s"
- heredoc结构:像一个没用引号括起来的双引号字符串,用<<<+标签名表示开头,用标签结束。结束标签必须在一行的开头例如:
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
标签可用双引号括起来以示和Nowdoc的区别
- Nowdoc结构:不进行任何转义操作。标签用单引号括起来。
$str = <<<\'EOD\'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
- 字符串中的变量名可以直接由其他字符串解析生成
<?php
$a = "foo";
$foo = "this is foo";
echo "{${$a}}";
?>
- 读写字符
- $str[2] = \'a\';
- strlen:取字符串长度
- substr(string $string , int $start [, int $length ] )取一个子串。
- 其他操作
- 连接:用点.直接连接,不能用加号。
- 若和数字相加,则转化成数值如"10 pigs"+3=3
- 数组
- 概述:PHP的数组是一个把value映射到key的有序映射,key还可以是数组,因此可以表示很多数据结构。
- 定义数组:
array( key => value
, ...
)
// 键(key) 可是是一个 整数(integer) 或 字符串(string),不能用数组和对象作为键(key)。省略键名则键名自动变为整数。$firstquarter = array(1 => \'January\', \'February\', \'March\');将自动累加
// 值(value) 可以是任意类型的值
- 访问:使用方括号访问
$arr[key] = value;
$arr[] = value;//新建元素
- 删除键:unset($arr[5]);
unset($arr);//全部删除
- 遍历数组:foreach($arry as $i)
- 对象
- 使用new建立。详见后面的讨论
<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
- 资源类型:
- 保存打开文件、数据库连接、图形画布区域等的特殊句柄。
- NULL类型:
- 空类型
- Callbacks类型
- 回调函数
function my_callback_function() {
|
echo \'hello world!\'; |
}
call_user_func(\'my_callback_function\');
- 伪类型
- $... 表示等等的意思。
- 变量
- 基础
- 变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。
- $this是一个特殊的变量,它不能被赋值。
- 变量默认总是传值赋值。
- 引用赋值:(同C++)
$foo = \'Bob\'; // 将 \'Bob\' 赋给 $foo
$bar = &$foo;
- 预定义变量
- 见预定义变量章节
- 变量范围
- 和C语言不同,PHP 中全局变量在函数中使用时必须申明为global。以下代码将不会产生任何输出:
<?php
$a = 1; /* global scope */
function Test()
{
echo $a; /* reference to local scope variable */
}
Test();
?>
- 声明全局变量例子:
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
- 全局变量的使用还可以通过超全局变量数组$GLOBALS
<?php
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS[\'b\'] = $GLOBALS[\'a\'] + $GLOBALS[\'b\'];
}
Sum();
echo $b;
?>
- 静态变量:仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
- 可变变量:
一个变量的变量名可以动态的设置和使用。
<?php
$a = "foo";
$$a = "this is foo";
echo $foo;
?>
- 来自PHP外的变量
- 有_GET、_POST等
- 常量
- 常量的范围是全局的。不应该在常量前面加上 $ 符号
- 定义
- 用define("FOO", "something");定义。
- 用const定义:const CONSTANT = \'Hello World\';
- 魔术常量
- 多由他们所在代码位置决定。常用 的见下表:
名称 |
说明 |
__LINE__ |
文件中的当前行号。 |
__FILE__ |
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。 |
__DIR__ |
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) = |
__FUNCTION__ |
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 |
__CLASS__ |
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 |
__METHOD__ |
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。 |
__NAMESPACE__ |
当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增) |
几个 PHP 的“魔术常量”
- 表达式
- 定义:任何有值的东西。
- 和C语言一样,赋值,比较等表达式有值,支持 ++ += 和$first ? $second : $third
- 运算符
- 优先级:
运算符优先级
结合方向 |
运算符 |
附加信息 |
非结合 |
clone new |
|
左 |
[ |
|
非结合 |
++ -- |
|
非结合 |
~ - (int) (float) (string) (array) (object) (bool) @ |
|
非结合 |
instanceof |
|
右结合 |
! |
|
左 |
* / % |
|
左 |
+ - . |
|
左 |
<< >> |
|
非结合 |
< <= > >= <> |
|
非结合 |
== != === !== |
|
左 |
& |
|
左 |
^ |
|
左 |
| |
|
左 |
&& |
|
左 |
|| |
|
左 |
? : |
|
右 |
= += -= *= /= .= %= &= |= ^= <<= >>= |
|
左 |
and |
|
左 |
xor |
|
左 |
or |
|
左 |
, |
多处用到 |
- 算数运算符
例子 |
名称 |
结果 |
-$a |
取反 |
$a 的负值。 |
$a + $b |
加法 |
$a 和 $b 的和。 |
$a - $b |
减法 |
$a 和 $b 的差。 |
$a * $b |
乘法 |
$a 和 $b 的积。 |
$a / $b |
除法 |
$a 除以 $b 的商。 |
$a % $b |
取模 |
$a 除以 $b 的余数。$a<0时也<0 |
- 位运算
例子 |
名称 |
结果 |
$a & $b |
And(按位与) |
将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b |
Or(按位或) |
将把 $a 或者 $b 中为 1 的位设为 1。 |
$a ^ $b |
Xor(按位异或) |
将把 $a 和 $b 中不同的位设为 1。 |
~ $a |
Not(按位非) |
将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b |
Shift left(左移) |
将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
$a >> $b |
Shift right(右移) |
将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
- 比较运算符
例子 |
名称 |
结果 |
$a == $b |
等于 |
TRUE,如果 $a 等于 $b。 |
$a === $b |
全等 |
TRUE,如果 $a 等于 $b,并且它们的类型也相同。(PHP 4 引进) |
$a != $b |
不等 |
TRUE,如果 $a 不等于 $b。 |
$a <> $b |
不等 |
TRUE,如果 $a 不等于 $b。 |
$a !== $b |
非全等 |
TRUE,如果 $a 不等于 $b,或者它们的类型不同。(PHP 4 引进) |
$a < $b |
小与 |
TRUE,如果 $a 严格小于 $b。 |
$a > $b |
大于 |
TRUE,如果 $a 严格 $b。 |
$a <= $b |
小于等于 |
TRUE,如果 $a 小于或者等于 $b。 |
$a >= $b |
大于等于 |
TRUE,如果 $a 大于或者等于 $b。 |
- 错误控制运算符
@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。但是不能把它放在函数或类的定义 ,if 和 foreach 不能用。
- 执行运算符
反引号`……`(数字1左边那个键),PHP 将尝试将反引号中的内容作为外壳命令来执行,h和shell_exec()一样。
<?php
$output = `ls -al`;
echo "<pre>$output</pre>";
?>
- 自增自减运算符:同C
- 逻辑运算符
例子 |
名称 |
结果 |
$a and $b |
And(逻辑与) |
TRUE,如果 $a 与 $b 都为 TRUE。 |
$a or $b |
Or(逻辑或) |
TRUE,如果 $a 或 $b 任一为 TRUE。 |
$a xor $b |
Xor(逻辑异或) |
TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是。 |
! $a |
Not(逻辑非) |
TRUE,如果 $a 不为 TRUE。 |
$a && $b |
And(逻辑与) |
TRUE,如果 $a 与 $b 都为 TRUE。 |
$a || $b |
Or(逻辑或) |
TRUE,如果 $a 或 $b 任一为 TRUE。 |
- 字符串运算符:.和.=
- 数组运算符
例子 |
名称 |
结果 |
$a + $b |
联合 |
$a 和 $b 的联合。把右边的数组元素(除去键值与左边的数组元素相同的那些元素)附加到左边的数组后面。 |
$a == $b |
相等 |
如果 $a 和 $b 具有相同的键/值对则为 TRUE。 |
$a === $b |
全等 |
如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。 |
$a != $b |
不等 |
如果 $a 不等于 $b 则为 TRUE。 |
$a <> $b |
不等 |
如果 $a 不等于 $b 则为 TRUE。 |
$a !== $b |
不全等 |
如果 $a 不全等于 $b 则为 TRUE。 |
- 类型运算符instanceof
用于确定一个 PHP 变量是否属于某一类 class 或接口 Interface的实例。
<?php
class MyClass
{
}
$a = new MyClass;//输出bool(true)
var_dump($a instanceof MyClass);
?>
- 控制结构
- If
- If(expr){
}elseif{//就比C多了个elseif
}elseif{
}else{
}
- 流程控制的替换结构:
- 常用于和html交叉的时候,如果只有花括号,则看不清楚。规则是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。
<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>
- while,do-while:同C
- 一种奇葩的do-while写法,用于解决分支判断。
<?php
do {
if ($i < 5) {
echo "i is not big enough";
break;
}
$i *= $factor;
if ($i < $minimum_limit) {
break;
}
echo "i is ok";
/* process i */
} while(0);
?>
- for:同C
- foreach
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
- 每次循环中,当前单元的值被赋给 $value,键名也会在每次循环中被赋给变量 $key
- foreach 不支持用“@”来抑制错误信息的能力。
- 修改数组值的方法:
- 使用引用
foreach ($arr as &$value) {
$value = $value * 2;
}
- break,continue
- break 可以接受一个可选的数字参数来决定跳出几重循环。
- continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。
- switch-case
- 同C,但是可接受字符串做case的内容
- require 和include
- require 语句包含并运行指定文件。require 和 include 几乎完全一样,除了处理失败的方式不同之外。 include 产生一个Warning而 require 则导致一个 Fatal Error。
- Require_once和include_once
- 只包含一次
- goto
- 函数
- PHP 中的所有函数和类都具有全局作用域,可以在内部定义外部调用,反之亦然。
- PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。
- PHP 可以再函数中定义函数,但是里面的函数必须等到外面函数执行后才有定义
function foo()
{
function bar()
{
echo "I don\'t exist until foo() is called.\n";
}
}
- PHP 支持可变数量的参数和默认参数。具体请参考: func_num_args(), func_get_arg(),以及 func_get_args()
- 参数:
- 一般是值传递,引用传递需加&。
- 支持默认参数,默认值需为常数,任何默认参数必须放在任何非默认参数的右侧
- 返回引用
- 需在函数声明和使用时同时使用&符号
<?php
function &returns_reference()
{
return $someref;
}
$newref =& returns_reference();
?>
- 可变函数
- 如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。
<?php
function foo() {
echo "In foo()<br />\n";
}
$func = \'foo\';
$func(); // This calls foo()
?>
- 用function_exists检查这个函数是否存在,用call_user_func调用(和可变函数等价)
- 匿名函数
- (Anonymous functions),也叫闭包函数(closures)允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)的参数
- 匿名函数目前是通过 Closure类来实现的。目前还不稳定,不适用于正式开发。
- 类与对象
- 基本概念
- $this 是一个到调用对象的引用。
- 声明实例
<?php
class SimpleClass
{
// 成员声明
public $var = \'a default value\';
// 方法声明
public function displayVar() {
echo $this->var;
}
}
?>
- 成员初始化应该用常量,不能用表达式,即使表达式是常量。
- 对象复制默认采用引用的形式
<?php
$instance = new SimpleClass();
$assigned = $instance;
?>
assigned是instance的一个引用
- 继承
- 使用extends
- 不能多继承
- 可以通过 parent:: 来访问被覆盖的方法或成员。
- 属性
- 访问控制类型:public, protected, 和 private
- 访问方式(有点像指针):$this->property(property是属性名字),不加$
- 静态属性:self::$property,self指该类
- nowdocs可以在声明时使用,可以初始化任何静态数据。heredocs不行。
public $var8 = <<<\'EOD\'
hello world
EOD;
正确
- public $var2 = <<<EOD
hello world
EOD;
错误
- 自动加载对象
- 使用__autoload函数
<?php
function __autoload($class_name) {
require_once $class_name . \'.php\';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?>
在调用new时,自动加载其文件
- 构造函数和析构函数
- 子类构造函数、析构函数不会自动调用父类构造函数,若需调用需显示声明parent::__construct()parent::__destruct()
- 尽量不要使用和类名相同的函数,防止和以前版本冲突
- 析构函数即使在使用 exit()终止脚本运行时也会被调用。
- 访问控制
- 没有定义访问控制的,默认设置为 public。
- 范围解析操作符(::)
- 用于访问静态成员、方法和常量
- self 和 parent 用于在类的内部对静态成员或方法进行访问
- Static关键字
- 不能通过一个对象来访问其中的静态成员(静态方法除外)
- 伪变量$this在静态方法中不可用
- 静态属性不可以由对象通过->操作符来访问。
- 抽象类
- 抽象类不能直接实例化
- 子类必须重写所有的抽象方法
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}
- 接口
- 用interface定义,用implements实现。
- 一个接口可以继承另一个接口,用extends继承,继承则不用实现。
- 接口都是public
- 例:
interface a
{
public function foo();
}
interface b extends a
{
public function baz(Baz $baz);
}
// 正确写法
class c implements b
{
public function foo()
{
}
public function baz(Baz $baz)
{
}
}
- traits
- 用于解决无法多重继承的问题
- 使用关键字traits声明一个traits,在子类里用use关键字引入(可加入多个)。覆盖的优先级是:子类覆盖traits覆盖父类。
- 若多个traits之间有冲突,通过insteadof和as来消解冲突。as还可改变可见性
<?php
trait A {
public function smallTalk() {
echo \'a\';
}
public function bigTalk() {
echo \'A\';
}
}
trait B {
public function smallTalk() {
echo \'b\';
}
public function bigTalk() {
echo \'B\';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
B::bigTalk as talk;
}
}
?>
- 重载
- 和C++完全不一样
- 重载指调用一个不存在的对象或方法时,将调用指定的魔法函数。
- 属性重载
public void __set ( string $name , mixed $value )
public mixed __get ( string $name )
public bool __isset ( string $name )
public void __unset ( string $name )
在给未定义的变量赋值时,__set() 会被调用。
读取未定义的变量的值时,__get() 会被调用。
当对未定义的变量调用 isset() 或 empty()时,__isset() 会被调用。
当对未定义的变量调用 unset()时,__unset() 会被调用。
参数$name是指要操作的变量名称。__set() 方法的$value 参数指定了$name变量的值。
- 方法重载
public mixed __call ( string $name , array $arguments )
public static mixed __callStatic ( string $name , array $arguments )
当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。
当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。
$name 参数是要调用的方法名称。$arguments 参数是一个数组,包含着要传递给方法$name 的参数。
- 对象迭代
- 就像使用数组那样,可以通过foreach 来遍历对象中的属性。
- 可以继承系统预定义的接口Iterator,然后重写里面的方法,可自定义迭代的方式。
- 两个PHP常用的设计模式
- 工厂模式:
- 工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是 你要生成的对象对应的类名称。
<?php
class Example
{
// The parameterized factory method
public static function factory($type)
{
if (include_once \'Drivers/\' . $type . \'.php\') {
$classname = \'Driver_\' . $type;
return new $classname;
} else {
throw new Exception (\'Driver not found\');
}
}
}
// Load a MySQL Driver
$mysql = Example::factory(\'MySQL\');
// Load a SQLite Driver
$sqlite = Example::factory(\'SQLite\');
?>
- 单例模式
- 单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
- 通过将构造函数声明成private,禁止生成,重载__clone()方法。
- 注意PHP5的对象使用引用复制的方式
- 例
<?php
class Example
{
// 保存类实例在此属性中
private static $instance;
// 构造方法声明为private,防止直接创建对象
private function __construct()
{
echo \'I am constructed\';
}
// singleton 方法
public static function singleton()
{
if (!isset(self::$instance)) {
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
// Example类中的普通方法
public function bark()
{
echo \'Woof!\';
}
// 阻止用户复制对象实例
public function __clone()
{
trigger_error(\'Clone is not allowed.\', E_USER_ERROR);
}
}
?>
<?php
// 这个写法会出错,因为构造方法被声明为private
$test = new Example;
// 下面将得到Example类的单例对象
$test = Example::singleton();
$test->bark();
// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;
?>
- 魔术方法
- 在类或对象完成一些操作时,会调用魔术方法,如构造和析构就是通过重载的魔术方法来实现。见上面重载小节。
- final关键字
- 如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。
- 复制对象
- 因为一般对象复制都是引用复制的形式,因此,想要完全复制,需使用clone关键字
- $copy_of_object = clone $object;
- 魔术方法__clone():当复制完成时, 如果定义了__clone()方法, 则新创建的对象(复制生成的对象)中的__clone()方法会被调用
- 对象比较
- ==:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。
- ===:必须指向同一实例
- 指定函数参数类型
- 在PHP中,可以通过在函数参数上加类型来强制指定参数类型。
- 后期静态绑定
- static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。
- 对象序列化
- 使用函数 serialize()来返回一个包含字节流的字符串来表示。
- 命名空间
- 定义命名空间
- 用namespace关键字来定义,必须放在所有其他代码之前
- 命名空间可以拆开放在多个文件里面。
- 子命名空间
- 命名空间可以分层定义namespace MyProject\Sub\Level;表示是某个命名空间的子命名空间。
- 在一个文件中定义多个命名空间
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // global code
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
建议最好用大括号括起来。
- 使用方式
- \Foo\Bar\foo::staticmethod();像文件路径一样。
- 在命名空间内部访问全局类、函数和常量$b = \INI_ALL; // 访问全局常量 INI_ALL
- 魔法常量__NAMESPACE__
- 包含当前命名空间名称的字符串。
- namespace关键字
- 可用来显式访问当前命名空间或子命名空间中的元素。
namespace MyProject;
namespace\blah\mine(); // calls function MyProject\blah\mine()
- 使用别名导入
- 使用use as
- use My\Full\Classname as Another
- 全局空间
- 名称前加上前缀 \ 表示该名称是全局空间中的名称
- $b = new \Exception(\'hi\'); // $b 是类 Exception 的一个对象
- 异常处理
- 同C++
- class MyException extends Exception继承异常处理
- Generator
- 一个函数,使用 yield返回一个generate
<?php
function gen_one_to_three() {
for ($i = 1; $i <= 3; $i++) {
// Note that $i is preserved between yields.
yield $i;
}
}
$generator = gen_one_to_three();
foreach ($generator as $value) {
echo "$value\n";
}
?>
每次调用哪个generater都会返回一个值
- generator只能向前不能向后
- 引用
- 同C++
- 返回引用时 return不要加括号!否则是返回一个表达式的值
- 取消引用unset()
- 预定义变量
超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER — 服务器和执行环境信息
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTP Request 变量
$_SESSION — Session 变量
$_ENV — 环境变量
$_COOKIE — HTTP Cookies
$php_errormsg — 前一个错误信息
$HTTP_RAW_POST_DATA — 原生POST数据
$http_response_header — HTTP 响应头
$argc — 传递给脚本的参数数目
$argv — 传递给脚本的参数数组
- 超全局变量
- 在任何地方都可以使用,包括
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV