什么是变量
变量指的就是在程序执行过程中数值可以变化的量,它与我们所讲的常量是相反的,我们常量是只要被定义了,在程序中就不能被改变。而变量是可以变的。
变量作用
变量就是用来保存我们值,相当于一个存储数据的容器。

x = 5;
y = 6;
z = x + y;

从上面的表达式 z = x + y;我们能够计算出 z 的值是 11
在 PHP 中,这三个字母就被称为变量。

变量赋值

变量赋值,是指给一个变量具体的数据值,对于字符串和数字类型的变量,可以通过“=”来实现赋值,像上面一样例子一样,x和y是变量,那么5和6就是变量的值了。

声明变量
通过美元符号 $变量名称 来表示变量

$x = 5;
$y = 6;
$z = $x + $y

上面的实例就完成了我们对变量的定义与赋值了。

PHP 变量规则

  1. 变量以 $ 符号开始,后面跟着变量的名称
  2. 变量名必须以字母或者下划线字符开始
  3. 变量名只能包含字母数字字符以及下划线
  4. 变量名不能包含空格
  5. $A驼峰标记法(firstName)或者下划线法命名(first_name)
  6. 变量名称严格区分大小写,$y和$Y是两个变量,如果变量名称重复,后面的值会覆盖前面的值
  7. 变量可以不声明,直接使用

除了上面的变量直接赋值外,还有两种方式可以声明变量和赋值,一种是变量间的赋值,什么意思呢?看下面的实例

<?php
$str1 = 'hello';
$str2 = $str1;
$str1 = 'world';
echo $str2;

输出 “hello”

我们并没有给变量$str2直接赋值,而是将变量$str1赋值给$str2,这就是我们变量间的赋值。

另一种是引用赋值。从PHP4开始,PHP引入了“引用赋值”的概念,就是用不同的名字访问同一个变量内容。当改变其中任何一个变量的值,另一个也会发生变化。引用赋值使用“&”来表示引用。

引用和赋值的区别在于,赋值是将原变量内容复制下来,再用一个新的内存空间来保存,而引用则是给变量的内容在起一个名字,相当于一个别名。就好像一些文学爱好者经常会向报纸,杂志投稿件,但一般都不会真名,而是用笔名,这个笔名就可以看作是一个引用。

<?php
//php引用变量:不同变量名指向同一地址

//定义一个变量a,此时内存开辟了一块区域,$a指向该区域
$a = 100;
var_dump($a); //int 100
//定义变量b,将a变量的值赋值给b,此时该区域有两个变量($a和$b)指向。
$b = $a;
var_dump($b); //int 100
//修改$a变量的值,php变量具有Copy On Write的特性,所以会复制并重写a所指向的区域值,此时a和b分别指向不同区域。
$a = 10;
var_dump($a); //int 10
var_dump($b); //int 100

$c = 100;
$d = &$c;
$c = 10;
var_dump($c); //int 10
var_dump($d); //int 10
//当引用指向时,php变量不在具有Copy On Write特性,且指向同一内存区域,无论$c或$d谁变化,另外一个都会变化

可变变量(使用两个美元符号($))

$a = "hello";

$$a = "world";

两个变量都被定义了:$a 的内容是“hello”,并且 $hello 的内容是“world”。因此,可以表述为:

echo “$a ${$a}”;或者 echo “$a $hello”;它们都会输出:hello world

变量作用域

变量在使用时要符合变量的定义规则。变量必须在有效的范围使用,如果变量超出了有限范围,变量也就没有意义了,就好像我们有一沓人民币,我们可以在中国购买商品,但如果来到国外,那么这一沓人民币也就不能用了。这一沓人民币就相当于这个变量,而中国以内的范围就相当于作用域。

PHP的变量由于作用域不同分为:局部变量,全局变量和静态变量,如下表:

局部变量 在函数的内部定义的变量,作用域就是所在的函数范围
全局变量 在被定义所有的函数以外的变量,作用域是整个PHP文件,但是在用户自定义函数内部是不能使用的。如果希望用户在用户自定义函数内部使用全局变量,则使用global关键字声明全局变量
静态变量 能够在函数调用结束后仍保留变量值,当再次回到其作用域,又可以继续使用原来的值。而一般变量是在函数调用后,其存储的数据值会被清除,所占用的内存空间也会被释放。使用静态变量时,先要用关键字static来声明变量,把关键字static放在要定义的变量之前

TIPS

在函数内部定义的变量,其作用域为所在的函数,如果在函数外赋值,将被认为是完全不同的另一个变量。在退出声明变量的函数时,该变量及相应的值就会被清除。

本实例用于比较在函数内赋值的变量(局部变量)和在函数外赋值的变量(全局变量),实例代码如下:

<?php
$exam= "在函数外定义"; //声明全局变量

function add(){
    $exam="在函数内定义"; //声明局部变量
    echo "在函数内输出的内容是:".$exam."<br/>"; //输出局部变量
    }
add(); //调用函数
echo "在函数外输出的内容是:".$exam; //输出全局变量
?>

运行结果:
在函数内输出的内容是:在函数内定义
在函数外输出的内容是:在函数外定义

静态变量在很多地方都能用到,静态变量类型说明符是static。

  1. static全局变量只初始化一次,防止在其他文件单元中被引用
  2. static局部变量只被初始化一次,下一次依据上一次结果值
  3. static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

下面的实例使用静态变量和普通变量同事输出一个数据,查看一下两者的功能有什么不同,代码如下:

<?php
function zdy0(){
    static $message = 0; //初始化静态变量
    $message+=1;
    echo $message." ";
}

function zdy1(){
    $message = 0; //初始化静态变量
    $message+=1;
    echo $message." ";
}

for ($i=0;$i<10;$i++){
    zdy0();   //输出1~10
}
echo "<br>";

for ($i=0;$i<10;$i++){
    zdy1(); //输出10个1
}