变量定义和命名规范
传值和引用
预定义变量
变量范围
全局变量
静态变量
可变变量
变量定义和命名规范
变量定义
PHP 中的变量用一个美元符号 $ 后面跟变量名来表示。
命名规范
变量名区分大小写,一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。
传值和引用
传值
变量默认总是传值赋值。这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
执行结果为
说明传值赋值,不会因为原变量改变二改变
引用
PHP 也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量相当于原变量的别名,改动新的变量将影响到原始变量,反之亦然。
使用引用赋值,简单地将一个 & 符号加到将要赋值的变量前
结果为
有一点重要事项必须指出,那就是只有有名字的变量才可以引用赋值。例如,&(2 * 3) 为非法形式。
编辑 /home/project/test.php
执行 php test.php
预定义变量
PHP 提供了大量的预定义变量。其中一些变量依赖于运行的服务器的版本和设置,及其它因素。
- $GLOBALS — 引用全局作用域中可用的全部变量
- $_SERVER — 服务器和执行环境信息
- $_GET — HTTP GET 变量
- $_POST — HTTP POST 变量
- $_FILES — HTTP 文件上传变量
- $_REQUEST — HTTPRequest 变量
- $_SESSION — Session 变量
- $_ENV — 环境变量
- $_COOKIE — HTTPCookies
- $php_errormsg — 前一个错误信息
- $HTTP_RAW_POST_DATA — 原生 POST 数据
- $http_response_header — HTTP 响应头
以下预定义变量只在命令行执行的时候生效
- $argc — 传递给脚本的参数数目
- $argv — 传递给脚本的参数数组
变量范围
变量的范围即它定义的上下文背景(也就是它的生效范围)。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。例如:
这里变量 $a 将会在包含文件 b.php 中生效。但是,在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。
编辑 /home/project/variable.php
执行 php variable.php
从结果中可以看出,函数要使用外部变量可以通过传参实现,此外还可以使用下节实验中的全局变量。
全局变量
全局变量通常使用关键字 global 来声明
结果输出 3。在函数中声明了全局变量 a 和a和b 之后,对任一变量的所有引用都会指向其全局版本。对于一个函数能够声明的全局变量的最大个数,PHP 没有限制。
在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。前面的例子可以写成:
上节实验中,通过传参实现了函数调用外部变量,接下来使用 global 关键字
编辑 /home/project/variable.php
执行 php variable.php
静态变量
变量范围的另一个重要特性是静态变量。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子:
每次调用时都会将 a 的值设为 0 并输出 0。将变量加一的a的值设为0并输出0。将变量加一的a++ 没有作用,因为一旦退出本函数则变量 $a 就不存在了。
要写一个不会丢失本次计数值的计数函数,要将变量 $a 定义为静态的:
编辑 /home/project/test.php
执行 php test.php
可变变量
一个变量的变量名可以动态的设置和使用,例如:
结果输出
上例中动态设置了一个变量 $hello,通常多个
编辑 /home/project/test.php
执行 php test.php