基本概念
- 定义
一个$作为前缀的标识符。 - 特性
变量可以存放任意类型的值。在编译或运行时没有变量的类型检查,可以用其他不同类型的值替换一个变量的值。 - 声明
不需要用显示的语法来声明变量。变量第一次被赋值时,该变量被创建。设置变量的值也有声明变量的功能。 - 未赋值
变量如果没有被赋值,则其值为NULL。
变量的变量
- 定义
通过$符号作为前缀,引用变量的值作为新变量的名称。 - 示例
$foo = "bar";
$$foo = "baz";
则
$baz = "bar";
变量的引用
- 定义
引用就是如何创建变量的别名。
$blac =& $white;
- 解释
两个变量,任意一个值改变,另一个值也随之改变。 - 销毁
销毁其中一个变量的值,不影响另一个值。 - 函数引用
函数可以通过引用返回值(?)
function &retRef()
{
$var = "PHP";
return $var;
}
$v =& retRef();
变量的作用域
- 定义
变量声明的位置决定了一个变量的作用域。总计4种类型作用域:局部作用域、全局作用域、静态作用域和函数参数。 - 局部作用域
在一个函数中声明。仅在函数内部可见。全局变量不能在函数内部访问。 - 全局作用域
函数外部声明,任意部位访问。函数内部需要先用global关键字声明后,才可访问。
function updateCounter()
{
global $counter;
$counter++;
}
$counter = 10;
updateCounter();
则
$counter = 11;
使用$GLOBALS数组
function updateCounter()
{
$GLOBALS[counter]++;
}
$counter = 10;
updateCounter();
echo $counter;
11
- 静态变量
静态变量在一个函数被多次调用时,其值不会丢失,但此变量仅在该函数内可见(与全局变量的区别)。
function updateCounter()
{
static $counter = 0;
$counter++;
echo $counter;
}
$counter = 10;
updateCounter();
updateCounter();
echo $counter;
1
2
10
- 函数参数
函数参数只在函数内部有效。
function greet($name)
{
echo $name;
}
greet("Janet");
输出:
Janet
垃圾收集
- 符号表
一个变量有两个部分,它的名字和它的值。符号表是一个将变量名映射到内存中变量值所在地址的数组。 - 引用计数
符号表中的每一个值都有一个引用计数器,它的数值表示获取那片内存的方式的数目。
当一个变量离开作用域,如函数参数和局部变量到达函数末尾时,它的值的引用计数减1。当一个变量在其他内存空间被赋值时,旧值的引用计数减1。当引用计数的值为0时,他的内存被释放。 - 写时复制
当将一个变量的值复制到另一个变量时,PHP没有为复制值使用更多的内存。相反,它会更新符号表来说明这两个变量拥有相同的内存快。如果后台修改了任意一个副本,PHP将分配所需的内存来进行复制。
$worker = array("Fred", 35, "Wilma");
$other = $worker; // 数组不被复制
$worker[1] = 36; // 值改变,数组被复制
- 手动管理内存
如果要查看一个变量是否被设置甚至是空字符串,可使用isset()。
$s1 = isset($name); // $s1是 false
$name = "Fred";
$s2 = isset($name); // $s2是true
使用unset()删除变量的值。
$name = "Fred";
unset($name); //$name 是 NULL