概念
指存储数据的临时容器(空间)。由三部分构成: 变量名、变量值、内存地址
命名规则
►变量名必须以美元符号($)开始,第一个字符可以是字母或下划线但不能以数字开始
►变量名称只包含字母、数字、“_”,可用中文但不推荐
►区分大小写
►不允许包含空格
►驼峰命名法、下划线法
※$this 是一个特殊的变量,它不能被赋值。
编写$php; //定义
$php = "aaa"; //定义并赋值变量
unset($php); //删除变量
作用域Scope
变量的作用域由变量声明的地方所限制,决定程序哪些部分可以使用该变量。有四种:局部作用域(函数内部定义变量),全局(函数外部定义),静态,函数形参。
可变变量Variable Variables
一个变量的值为另一个变量的名$a = 'hello';
$hello = 'world';
echo $$a //输出结果为world
静态变量Static
静态变量只存在于函数内,其值在函数执行结束后不会被重置
传值方式
►复制传值:一个变量将其值复制一份,产生一个新的内存地址,再给第二个变量,第二个变量指向新的内存地址
►引用传值(Variable Reference):使用"$var = &$othervar;"语法,引用赋值意味着两个变量指向了同一个数据,没有拷贝任何东西。
相关函数
►var_dump() — 直接打印变量的相关信息,不用加echo
►isset() — 检测变量是否已定义且非 NULL
►empty() — 检查变量是否已定义且非零非空
以下值被认为是False
※isset()与empty()不会直接输出结果,可用于if的判断条件。
※empty() 本质上与 !isset($var) || $var == false 等价。
※只有empty只能判断一个变量,var_dump()、isset()、unset()可判断多个变量.
超全局变量
1) $_GET //接收地址栏传值
2) $_POST //接收表单post传值
3) $_REQUEST //既有$_GET,又有$_POST功能
4) $_SERVER //获取服务器相关信息
5) $_SESSION //会话的一种,数据存储在服务器端
6) $_COOKIE //会话的一种,数据存储在客户端
7) $_FILES //获取上传文件的相关信息
8) $GLOBALS //包含以上所有数据
※超级全局变量不能被用作函数或类方法中的可变变量。
垃圾回收机制Garbage Collection
每个php变量存在一个叫"zval"的变量容器中。容器除了包含变量的类型和值,还包括两个属性。
第一个是"is_ref",是布尔值,标识该变量是否是属于引用集合(reference set)。通过该属性,php引擎才能把普通变量和引用变量区分开来,由于php允许用户通过使用&来使用自定义引用,zval变量容器中还有一个内部引用计数机制,来优化内存使用。
第二个是"refcount",即reference counting,表示指向该zval变量容器的变量个数(也称符号即symbol)。所有的符号存在一个符号表(symbol table)中,其中每个符号都有作用域(scope),每个函数或方法也都有作用域。
当一个变量被赋常量值时,即生成一个zval变量容器,如:
$a = "new string";
//此时,"is_ref"默认设置为 FALSE,因为没有任何自定义的引用传值。
//"refcount" 为1,因为只有一个变量使用该容器
$b = $a;
//这时引用次数是2,因为同一个容器被$a和$b关联,php不会复制已生成的容器,而是更新symbol table将两个变量指向同一内存。
$a = "new string again";
//php复制已生成的容器给$b,现在有两个容器且引用计数均为1
当任何关联某个容器的变量离开其作用域(如:函数执行结束),或者变量被执行了函数 unset()时,引用计数refcount就会减1。当变量容器在"refcount"变成0时就成为垃圾,被回收销毁,容器与其值均不复存在,从而释放内存。
性能影响
第一,垃圾回收机制节省内存占用。
在程序执行中,一旦根缓冲区满了或调用gc_collect_cycles()时,就会执行回收。
第二,垃圾回收释放内存会引起程序执行时间增加。
虽然运行时会增加时间消耗,但在简单的程序执行时几乎就没有性能影响。