当前位置: 首页 > 文档资料 > PHP 语言规范 >

07 变量

优质
小牛编辑
113浏览
2023-12-01

概述

变量是一个包含 PHP 值的存储数据的命名域。变量可以用VSlot来描述。通过对变量的赋值来创建变量。如果一个变量被定义,但是没有初始化的话,它的值就是NULL

变量的销毁既可以取消它的设置,又可以显示的调用unset方法,或者被PHP引擎销毁。isset 可以用来判断一个变量是否存在或者没有设置为NULL

变量有名称。命名相同的俩个独立变量可能会分别在不同的作用域里。

一旦被初始化,值就不会在改变的变量叫做常量

根据被声明的上下文,变量会有一个作用域存储周期

超全局变量是即使没有经过全局声明,也能够在全局自动生效的变量。

应该能够在 PHP 开发中遇到以下不同的变量种类:

变量的种类

常量

语法

参考 常量部分.

约束

在类或者接口外,c-constant 只能被定义在 PHP 脚本的最上层。

语义

参考常量类的常量

定义在类和接口外的常量是超全局变量。常量有静态存储期,并且是不能修改的左值。

实例

const MAX_HEIGHT = 10.5;        // define two c-constants
const UPPER_LIMIT = MAX_HEIGHT;
define('COEFFICIENT_1', 2.345); // define two d-constants
define('FAILURE', TRUE);

局部变量

语法

参考以下的语义。

语义

除非是函数的参数,否则局部变量不会显示的定义。换言之,当局部变量第一次被赋值时,它才被创建。 局部变量可以被赋值并作为一个函数定义的参数列表中的其中一个参数,或者在任何的复合语句中。并且会拥有函数的作用域存储生命周期。 一个局部变量是可以修改的左值。

实例

function doit($p1)  // assigned the value TRUE when called
{
  $count = 10;
    ...
  if ($p1)
  {
    $message = "Can't open master file.";
    ...
  }
  ...
}
doit(TRUE);
// -----------------------------------------
function f()
{
  $lv = 1;
  echo "\$lv = $lv\n";
  ++$lv;
}
for ($i = 1; $i <= 3; ++$i)
  f();

函数内的静态变量不同, 函数 f 的输出每次都是 "$lv = 1"。

参见在存储周期部分递归函数的实例。

数组元素

语法

数组可以通过数组运算符或特有的array 来创建。创建数组同时,也可以同时创建数据内的一个或多个元素。New elements are inserted into an existing array via the simple-assignment operator in conjunction with the subscript operator []. 数组内的元素可以通过unset内建函数删除。

语义

数组元素的作用域跟该数组的变量名的作用域是一样的。一个数组元素也有它的生命周期

实例

$colors = ["red", "white", "blue"]; // create array with 3 elements
$colors[] = "green";                // insert a new element

函数静态变量

语法

  function-static-declaration:
    static static-variable-name-list  ;

  static-variable-name-list:
    static-variable-declaration
    static-variable-name-list  ,  static-variable-declaration

  static-variable-declaration:
    variable-name function-static-initializeropt

  function-static-initializer:
    = constant-expression

在别处的定义

约束

必须是在函数内的定义。

语义

一个函数静态变量可以在任何复合语句中定义。 它是一个可以被改变的左值。

函数内的静态变量有函数的作用域和静态生命周期

函数静态变量的值在它的母函数被调用是是被一直保留的。每次包含静态变量的母函数被调用,都会去执行调用静态变量的一个别名。 只有当这个别名被执行特定的unset时,才会被销毁。等到下一次函数调用,会创建一个新的别名。

实例

function f()
{
  static $fs = 1;
  echo "\$fs = $fs\n";
  ++$fs;
}
for ($i = 1; $i <= 3; ++$i)
  f();

不像局部变量, 函数f 会输出"$fs = 1", "$fs = 2", 和 "$fs = 3", 因为 $fs 在函数调用期间保留了这个值。

全局变量

语法

  global-declaration:
    global variable-name-list ;

  variable-name-list:
    global-variable
    variable-name-list  ,  global-variable

  global-variable:
    variable-name
    variable-name-creation-expression

在别处的定义

约束

Each variable-name-creation-expression must designate a simple variable name, i.e. it can not include array elements, property accesses, etc. that are not inside braced expression. 每一个变量名创建表达式必须指定一个简单的变量名,比如它不能包括数组元素,属性访问等等that are not inside braced expression.

语义

全局变量重来不会显示的定义,而是在它第一次赋值时被创建。定义通常是在脚本的最上层进行,或者是从包含该变量声明的一个代码块中,并使用global关键字(引入它)。

One of the predefined variables, $GLOBALS is a superglobal array whose elements' key/value pairs contain the name and value, respectively, of each global variable currently defined. As such, a global variable gv can be initialized with the value v, and possibly be created, using the following form of assignment:

其中一个预定义变量$GLOBALS是一个超全局数组,它的元素都是键值对,分别包含 key 名称和值,从而定义了每一个全局变量。这样,一个全局变量gv能够用v值来初始化,并且被创建。用如下的形式来赋值:

$GLOBALS['gv'] = v

因为$GLOBALS 是一个超全局变量,gv 本身则不需要有全局声明

一个全局变量有全局的作用域,且有它的生命周期。 一个全局变量是一个可修改的左值。

当一个全局变量值被引入一个函数,每当该函数被调用,执行处理的只是该全局变量的一个别名。 只有当该全局变量之行了[系统函数unset]时,别名才会被销毁。当再次调用该函数时,会根据该全局变量的当前值创建一个新的别名。

实例

$colors = array("red", "white", "blue");
$GLOBALS['done'] = FALSE;
// -----------------------------------------
$min = 10; $max = 100; $average = NULL;
global $min, $max;         // allowed, but serves no purpose
function compute($p)
{
  global $min, $max;
  global $average;
  $average = ($max + $min)/2;

  if ($p)
  {
    global $result;
    $result = 3.456;  // initializes a global, creating it, if necessary
  }
}
compute(TRUE);
echo "\$average = $average\n";  // $average = 55
echo "\$result = $result\n";  // $result = 3.456
// -----------------------------------------
$g = 100;
function f()
{
  $v = 'g';
  global $$v;          // import global $g
  ...
}

实例属性

该部分内容出现在类的实例属性部分。实例属性有类定义的作用域, 并且分配了生命周期。访问实例属性是被类的可见性规则控制。

静态属性

该部分内容出现在类的静态属性部分。静态属性有类定义的作用域, 并且有静态生命周期。访问静态属性是被类的可见性规则控制。

类和接口常量

该部分内容出现在类的静态属性部分接口常量部分。静态属性有类定义的作用域,并且有静态生命周期

预定义变量

下述的全局变量在在脚本的任何地方都可以使用的:

变量名称描述
$argcint; 传递给脚本的命令行参数个数。最小值是1。(参考下面的$argv)。在非命令行下编译的引擎中是不可用的。
$argvarray; 传递给脚本的参数数组。第一个参数总是当前脚本的文件名,因此 $argv[0] 就是脚本文件名。
$_COOKIEarray; 通过 HTTP Cookies 传递给当前脚本的变量。
$_ENVarray; 通过环境方式传递给当前脚本的变量的数组。这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能运行着不同种类的 Shell,所以不可能有一份确定的列表。请查看你的 Shell 文档来获取定义的环境变量列表。
$_FILESarray; 通过 HTTP POST 方法传递给当前脚本的上传项目。
$_GETarray; 用过 URL 参数传递给当前脚本的变量。
$GLOBALSarray; 引用全局作用域中可用的全部变量,一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
$_POSTarray; 通过 HTTP POST 方法传递给当前脚本的变量。
$_REQUESTarray; 默认包含$_COOKIE, $_GET, 和 $_POST 的内容,根据引擎的配置可能包含其他内容。
$_SERVERarray; 服务器和运行环境的信息。比如头信息(headers)、路径(path)和脚本位置(script location)等等。这个数组中的项目由 Web 服务器创建。
$_SESSIONarray; 该 session 变量在当前脚本中有效。该全局变量只有当一个session 激活是才是被定义的。

所有以上的 $_* 变量都是超全局的。变量包含的精确内容要取决于实现、编译的引擎和具体的环境。