# 变量
## 基本介绍
* PHP中的变量用一个美元符号(`$`)后面加变量名来表示,**变量名区分大小写**。
* 一个有效的变量名由字母或者下划线开始,后面跟上任意数量的字母、数字、下划线以及 **中文汉字**。
* `$this` 是一个特殊的变量,它不能被赋值。
* 变量的赋值分为默认的 **传值赋值** 和 **引用赋值**。
* 引用赋值,使用时需在即将赋值的变量名前面加上`&`(and符号),例如`$two = &$one;`,这样新的`$two`变量的值如果发生改变,那么原始变量`$one`的值也会随之改变,反过来也一样。
* 变量可以使用引用赋值,但是没有名字的表达式不可以,例如`$two = &(5+6)`。
## 作用范围
* 变量有作用范围,大部分变量只有一个单独的范围,这个范围通常是指同处一个最近的上级大括号里,也就是同一个代码块里。
* 处于子代码块(如函数等)里的变量,我们叫他 **"局部变量"**,此外的变量可称之为 **"全局变量"**。
* 在同一个代码块里时,使用 `include` 或 `require` 引入的变量可以被使用,下面两种方式都是正确的。
~~~
<?php
// 引入A文件,里面就一行代码:$a = 123;
include "a.php";
// 这里可以引用到变量$a
echo $a;
// 定义b变量
$b = 456;
// 引入B文件,里面就一行代码:echo $b;
include "a.php";
?>
~~~
* 函数里的变量将有自己的作用范围,我们叫它局部变量,如果在函数里面需要使用外面的全局变量,需要通过`global`关键字声明变量,也可以使用PHP自定义的`$GLOBALS`数组来访问。
* 如下面这个例子中,调用`test()`函数将不会输出任何内容,而且会提示`$str`未定义的错误。
~~~
<?php
// 定义变量
$str = "abc";
// 定义函数
function test(){
// 输出str变量
echo $str;
}
// 调用函数
test();
~~~
* 将上面的例子修改一下,通过`global`关键字可以正确的访问到`$str`变量,结果将在浏览器上正确的输出字符串`"abc"`。
~~~
<?php
// 定义变量
$str = "abc";
// 定义函数
function test(){
// 声明变量
global $str;
// 输出str变量
echo $str;
}
// 调用函数
test();
~~~
* 将上面的例子还可以修改一下,通过PHP系统自定义的`$GLOBALS`数组来访问全局变量,结果也是正确的。
~~~
<?php
// 定义变量
$str = "abc";
// 定义函数
function test(){
// 输出str变量
echo $GLOBALS["str"];
}
// 调用函数
test();
~~~
* `$GLOBALS` 是一个 **超全局变量**,在系统运行时,里面会自动存入很多的系统变量和我们自定义的全局变量。
## 静态变量
* 通过`static`声明的变量称之为**静态变量**,静态变量在程序执行完成并且离开该作用范围后还会一直存在。
~~~
<?php
function test(){
// 声明静态变量
static $count = 0;
// 静态变量自增
$count++;
// 输出静态变量
echo $count;
}
// 第一次调用,输出1
test();
// 第一次调用,输出2
test();
~~~
* 静态变量的赋值对象不允许是表达式。
* 静态变量是编译时解析的。
## 可变变量
* 可变变量指的是一个变量的名称可以动态的设置和使用。
* 在变量的前面加上一个`$`美元符号,就可以使用可变变量,如下面的例子中,`$$a`对于系统来说会先拆分成`$`和`$a`,因为`$a`等于`key`,所以计算结果是`$key`。
~~~
// 定义A变量,值为key
$a = "key";
// 定义可变变量,值为value,相当于$key = "value"
$$a = "value";
// 输出$$a,得到value;
echo $$a;
// 输出$key,得到value;
echo $key;
~~~
* 系统解析可变变量的时候
* 在可变变量遇上数组的时候,需要解决一个让系统纠结的问题,例如`$$key[1]`,系统在解析的时候会出现如下两个情况:
* 情况一:`$` + `$key[1]`。
* 情况二:`$$key` + `[1]`。
* 对于上面两种情况,系统默认选择的是按情况一处理,假如我们想明确的控制,需要按下面这种方式使用:
* 情况一:`${$key[1]}`。
* 情况二:`${$key}[1]`。
* 官方的一个例子
~~~
<?php
$Bar = "a";
$Foo = "Bar";
$World = "Foo";
$Hello = "World";
$a = "Hello";
$a; // 得到 Hello
$$a; // 得到 World
$$$a; // 得到 Foo
$$$$a; // 得到 Bar
$$$$$a; // 得到 a
$$$$$$a; // 得到 Hello
$$$$$$$a; // 得到 World
~~~
> 注意,在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。
## 来自HTML页面中form的变量
* 通过系统内置的`$_GET`或`$_POST`数组可以分别获取来自于form表单GET或POST的内容,其中键对应input等标签的name属性值,值对应value的值。
* form表单中可以传递数组给PHP,只需给input等标签的name值后面加上数组索引。
* form表单中标签name值里如果包含了特殊字符(不符合PHP变量定义规则的字符),系统会自动将其转换成下划线。