什么是PHP变量?
变量是用于临时存储值的容器。这些值可以是数字、文本,或者复杂得多的排列组合。PHP 没有声明变量的命令,变量在您第一次赋值给它的时候被创建:
<?php $y='Hello world!';#美元符号“$”后跟变量名y,并给变量y赋值Hello world!。 echo $y; #运行结果为:Hello world!
PHP 变量规则
变量以 $ 符号开始,后面跟着变量的名称
变量名只能包含字母数字以及下划线(_)
变量名必须以字母或者下划线字符开始(不能以数字开始)
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量),但内置结构和关键字及用户自定义的类名和函数名是不区分大小写的。
PHP 中的一些关键字也可以作为变量名(例如 $true、$for)。
按照正常的正则表达式,它将被表述为:
'^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$'
。
在此所说的字母是 a-z,A-Z,以及 ASCII 字符从 128 到 255(0x80-0xff)。
PHP 是一门弱类型语言,不必向 PHP 声明该变量的数据类型。
建议定义的变量名要有一定的意义,例如使用 name 表示姓名;使用 url 表示网站链接等。当使用多个单词构成变量名时,可以使用下面的命名规范:
下划线命名法:将构成变量名的单词以下划线分割,例如 $my_name、$get_url;
驼峰式命名法(推荐使用):第一个单词全小写,后面的单词首字母小写,例如 $myName、$getUrl
;
帕斯卡命名法:将构成变量名的所有单词首字母大写,例如 $Name、$MyName、$GetUrl
。
PHP可变变量
一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
$a = 'hello'; $$a = 'world'; echo "$a ${$a}"; echo "$a $hello"; #它们都会输出:hello world。
扩展:{$variable}就是告诉PHP,{}括起来的要当成变量处理。
PHP变量赋值
在 PHP 中,为一个变量赋值的方式有三种,分别是直接赋值、拷贝赋值和引用赋值,下面就来分别介绍一下。
直接赋值就是使用“=”直接将值赋给某变量,示例代码如下:
<?php $name = "PHP"; echo $name;
拷贝赋值就是将一个变量的值,“复制”一份,再传给另一个变量。这两个变量都是相互独立的,它们之间没有任何关系,修改其中一个变量的值,另一个变量不会变,示例代码如下:
<?php $a = ‘PHP’; $b = $a; // 将$a的值复制一份,传给$b $a = ‘PHP7’; // 重新为 $a 赋值 echo '$a = '.$a.', $b = '.$b; #运行结果为:$a = PHP, $b = PHP7。
引用赋值就是将一个变量的内存地址,“复制”一份,传给另一个变量。这两个变量代表的是同一个值。改变其中一个,另一个也会改变。将一个“&”符号加到将要赋值的变量前(源变量)。
<?php $a = 'PHP'; $b = &$a; // 将$a的地址复制一份,传给$b $a = 'PHP7'; // 重新为 $a 赋值 echo '$a = '.$a.', $b = '.$b; #运行结果为:$a = PHP7, $b = PHP7。 ?>
注意:PHP 的引用并不是像 C 语言中的地址指针。例如,在表达式
$b=&$a
中,不会导致$a
和$b
在内存上同体,只是把各自的值相关联起来。基于这一点,使用unset()则不会导致所有引用变量消失。在执行unset($a)
后,变量$a
和$b
仅仅是互相取消值关联,$b
并没有因为$a
的释放而消失。
PHP变量作用域
变量的作用域是脚本中变量可被引用/使用的部分,范围跨度同样包含了 include 和 require 引入的文件。按作用域可以将 PHP 变量分为全局变量和局部变量两种。
局部变量与局部作用域
局部变量就是在函数的内部定义的变量,它只能在定义它的函数内使用。局部变量会在函数调用结束时自动销毁
?php function test(){ $a = "局部变量定义"; echo "局部变量 a 的值为:".$a."<br>"; } test(); if(isset($a)){ // 在函数外部调用 $a,如果 $a 存在则会打印下面的内容 echo "在函数外部调用函数内的局部变量 a,其值为:".$a; } #运行结果:局部变量 a 的值为:局部变量定义
说明:在函数外部并不能调用函数内部定义的局部变量,因为局部变量 $a 的作用域是定义它的 test() 函数,在函数以外的地方无法使用。
全局变量与全局作用域
全局变量就是定义在所有函数以外的变量,其作用域是当前源码的任何地方,但是在函数内部是不可用的(但不是绝对的,下面我们会介绍)。在程序运行期间全局变量会一直存在,只有程序结束运行时才会被销毁。
<?php $a = "全局变量定义"; function test(){ if(isset($a)){ echo "在函数内部调用全局变量 a,其值为:".$a; } } test(); echo "在函数外部调用全局变量 a,其值为:".$a; //运行结果:在函数外部调用全局变量 a,其值为:全局变量定义
说明:在 PHP 中,全局变量不能直接在函数内部使用。
global与$GLOBALS
global 关键字用于函数内访问全局变量,语法格式:global $variable
。
<?php $a = "全局变量定义"; function test(){ global $a; if(isset($a)){ echo "在函数内部调用全局变量 a,其值为:".$a; } } test(); echo "在函数外部调用全局变量 a,其值为:".$a; /*运行结果如下: 在函数内部调用全局变量 a,其值为:全局变量定义 在函数外部调用全局变量 a,其值为:全局变量定义 */
$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 中并不包含函数中的局部变量和静态变量。
<?php $a = "全局变量定义"; function test(){ if(isset($GLOBALS['a'])){ echo "在函数内部调用全局变量 a,其值为:".$GLOBALS['a']; } } test(); echo "在函数外部调用全局变量 a,其值为:".$a; /*运行结果如下: 在函数内部调用全局变量 a,其值为:全局变量定义 在函数外部调用全局变量 a,其值为:全局变量定义 */
与 global 相比,$GLOBALS 有一下几点不同:
global $var 指的是对函数外部同名变量的引用,是两个互不影响的变量,而 $GLOBALS[‘var’]
指的是函数外部变量本身,是一个变量。 $GLOBALS 不限定必须在函数内部使用,在程序的任意位置都能使用。
PHP预定义变量
预定义变量通常被称为自动全局变量(autoglobals)或者超全局变量(superglobals),它们不需要提前声明就可以在所有的作用域中使用。通过这些预定义变量可以获取用户会话、用户操作系统的环境和本地操作系统的环境等信息。
在函数或类方法中,超全局变量不能被用作可变变量。
超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER —服务器和执行环境信息
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTP Request 变量
$_SESSION — Session 变量
$_ENV — 环境变量
$_COOKIE — HTTP Cookies
$php_errormsg — 前一个错误信息
$http_response_header — HTTP 响应头
$argc — 传递给脚本的参数数目
$argv — 传递给脚本的参数数组
PHP static:静态变量
变量范围的另一个重要特性是静态变量(static variable)。语法:定义一个静态变量:static $variable = $value;
当同时定义多个静态变量static $variable1, $variable2, ...
。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子:
<?php function Test() { $a = 0; echo $a; $a++; }
本函数没什么用处,因为每次调用时都会将 $a 的值设为 0 并输出 0。将变量加一的 $a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了。要写一个不会丢失本次计数值的计数函数,要将变量 $a 定义为静态的:
<?php function test() { static $a = 0; echo $a; $a++; }
现在,变量 $a 仅在第一次调用 test() 函数时被初始化,之后每次调用 test() 函数都会输出 $a 的值并加一。
和局部变量相比,静态变量具有一下特点:
注意:对于变量的 static 和 global 定义是以引用的方式实现的。在函数外面使用静态变量时并不会报错,这时它的生命周期与作用域和全局变量是一样的;在函数内部定义静态变量时,它的生命周期也和全局变量一样,但是作用域和局部变量的作用域一样的。