前言
从开始接触PHP到写这篇文章为止不知不觉已经三年了。我写这篇文章的目的如标题,只是总结。可能不会太按部就班的讲解。对于我自己来说,学而时习之,可温故而知新。这也是我写博文的目的。对于读者来说,如果能从中受益,那再好不过。个人水平有限,对于文章中的错误之处,欢迎指正。
变量
首先来看看下面这张图。对于变量我们需要掌握一些什么东西。

1.什么是变量
顾名思义,变量是指在程序运行过程中随时可以发生改变的量。变量是一个容器,用来临时存储值。这些值可以是数字、文本等值...
php最基本的存储单元是变量和常量。因为php是弱类型语言,所以变量或常量的类型通常由赋给它们的值所决定。
2.变量的声明
由于php是弱类型语言,变量的类型由变量的值所决定。所以php并不同等于其它强类型语言要求先声明再使用变量。不过在php中未声明一个变量而去使用它,php解析器会报一个notice等级的错误。建议养成良好的习惯,先声明一个变量再去使用它。声明一个变量也叫做变量的初始化。
在php中声明一个变量,必须使用一个美元符号‘$‘后面跟变量名表示,使用赋值操作符‘=’给一个变量赋值。
变量名建议是以字母或下划线开头的由数字、字母下划线组成的标识符。中间不能有空格以及用点分开,变量名不能以数字开头。建议变量名使用英文单词描述,让变量名更语义化,增强代码的可读性。变量名由多个英文单词构成时则第一个单词全部采用小写字母,之后每个英文单词首字母采用大写的风格,这个命名风格称之为驼峰命名法。如:$aaaBbbCcc
,也可以英文单词全部采用小写字母,单词之间通过’_‘连接,如:$aaa_bbb_ccc
。有没有好奇的人,跟我想的一样,变量名能不能使用中文。答案是可以的。
<?php
$变量 = '变量值';
echo $变量; //输出为变量值
?>
这种风格的变量名,不建议使用。了解即可。另外变量名相对于其它语言来说,系统关键字是可以用来充当变量名的。比如function、echo、class等...但是系统关键字不能用于充当任何一个常量、类或函数名。
3.变量的释放
如果不是在一个函数中声明的变量,它的作用域是在从声明处,到文件结束的一个范围内使用(这种变量我们称之为全局变量)。php文件在php解析器解析完后变量自动销毁,回收内存空间。变量的销毁到内存的回收这一个过程叫变量的释放。
在变量的使用范围内,我们也可以手动的释放变量。此时要借助php为我们提供的一个系统函数unset()
<?php
$varName = 'varValue'; //声明并初始化变量varName
echo $varName.'<br>'; //输出变量值
unset($varName); //释放变量
echo $varName; //输出已经被释放后变量的值
?>
如果变量是在一个函数中声明的,那么此时我们称之为局部变量,局部变量的作用域在函数执行完后,在函数内部声明的变量将被释放掉。
- 使用php提供的系统函数
isset()
检测变量是否被设置并且值不是NULL
(声明或初始化)。已经使用unset()
释放了一个变量之后,它将不再是isset()
。 - 使用
empty()
检测一个变量是否为空。如果传入的参数是非空或非零值,该函数返回false。对于 "",0,"0",NULL,FALSE,array(),public $var 以及没有任何属性的对象都被认为是空的。
4.可变变量
可变变量的概念是一个变量的变量名来源于另一个变量的值。变量的名可以动态的设置和使用。
<?php
$yh = 'yunhua'; //声明并初始化变量$yh
$$yh = 'Deng yun hua'; //声明并初始化一个可变变量$$yh
echo $yh.'<br>'; //输出 'yunhua'
echo $$yh.'<br>'; //输出 'Deng yun hua'
echo $yunhua; //输出 'Deng yun hua'
?>
在上面的代码中可以发现变量$$yh
输出的值与$yunhua
输出的值时一样的。现在就按照数学思维来做一个等价替换
$yh = 'yunhua'
$$yh = $yunhua = 'Deng yun hua';
这样子根据概念理解起来,不难理解了吧。第一个变量保存的是第二个变量的变量名,php解析器首先会找到第二个变量名前面的$符,解析成对应的值。因为对应的值前边还有个变量声明符($)所以解析出来的值又被当成一个变量名了。
值得注意的是,在php中的数组中使用可变变量时需要解决一个模棱两可的问题,例如
$$a[1]
,解析器需要知道是想要$a[1]
作为一个变量呢,还是想要$$a
作为一个变量并取出该变量中索引为[1]
的值。解决此问题的语法是,对第一种情况用${$a[1]}
,对第二种情况用${$a}[1]
。上面例子中的$$yh
也可以写成${$yh}
。
5.变量的引用赋值
在php中给变量赋值有两种形式。一种是常见的是值传递,另一种是引用传递。下面我们看看这两种赋值有什么区别。
- 值传递
- 值传递是相当于把变量的值copy一份,放到新的内存地址空间保存在一个变量里。修改其中一个变量不会影响到另一个变量的值。此时一个变量保存的值只是另一个变量的副本而已。
<?php
$a = 1; //声明并初始化$a变量,值为1
$b = $a; //把$a的值赋值给$b变量,相当于把$a拷贝一份赋值给$b
$b = 3; //修改$b的值为3
echo $a; //输出$a为1
echo $b; //输出$b为3
?>
- 引用传递
-
引用传递是将一个变量里面保存的内存地址(变量里面保存的并不是具体的值,当我们去声明一个变量的时候,实际上是在内存区域中开辟一份存储空间去保存我们赋值给变量的值,此时该变量保存的是我们开辟内存空间的内存地址。)赋值给另一个变量,两个变量指向了同一个存储空间。所以修改其中任何一个变量,两个变量的值都会有影响。
<?php $a = 1; //声明并初始化$a变量,值为1 $b = &$a; //把$a变量保存的内存地址赋值给$b变量,$a、$b保存的内存地址是一样的。 $b = 3; //修改$b的值为3 echo $a; //输出$a为3 echo $b; //输出$b为3 ?>
-
举个简单的例子,好比你跟你朋友都有一把家里的钥匙(变量),这把钥匙能打开家里的门,当你跟你朋友打开家门进去后做的所有事,比如说丢一个肥皂,扔一个香蕉皮。都不会影响到彼此。证明,你跟你朋友都有自己的家(存储空间)。这是值传递,而反过来,当你朋友回到家后,你能看到扔到地上的肥皂和香蕉皮,那么证明你跟你朋友的钥匙都能打开家里的锁,你们两是住在一起的。其中一个人改变家里的布局,另一个人都能看得到。这是引用传递。
网友评论