PHP变量的作用域
2009-04-20 22:47
204 查看
变量范围
变量的范围即它定义的上下文背景。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。
变量 $a 将会在包含文件 b.inc 中生效
在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。
使用 global
在函数中声明了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。对于一个函数能够声明的全局变量的最大个数,PHP 没有限制。
在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。
$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。
使用静态变量
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:
例子 12-6. 静态变量与递归函数
如果在声明中用表达式的结果对其赋值会导致解析错误。
全局和静态变量的引用
在 Zend 引擎 1 代,驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。
变量的范围即它定义的上下文背景。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了 include 和 require 引入的文件。
<?php $a = 1; include "b.inc"; ?>
变量 $a 将会在包含文件 b.inc 中生效
在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。
使用 global
<?php $a = 1; $b = 2; function Sum(){ global $a, $b; $b = $a + $b; } Sum(); echo $b; ?>
在函数中声明了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量。对于一个函数能够声明的全局变量的最大个数,PHP 没有限制。
在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。
<?php $a = 1; $b = 2; function Sum(){ $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } Sum(); echo $b; ?>
$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。
使用静态变量
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。一下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:
例子 12-6. 静态变量与递归函数
<?php function Test(){ static $count = 0; $count++; echo $count; if ($count < 10) { Test (); } $count--; } ?>
如果在声明中用表达式的结果对其赋值会导致解析错误。
<?php function foo(){ static $int = 0; // correct static $int = 1+2; // wrong (as it is an expression) static $int = sqrt(121); // wrong (as it is an expression too) $int++; echo $int; } ?>
全局和静态变量的引用
在 Zend 引擎 1 代,驱动了 PHP4,对于变量的 static 和 global 定义是以 references 的方式实现的。例如,在一个函数域内部用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用。
<?php function test_global_ref() { global $obj; $obj = &new stdclass; } function test_global_noref() { global $obj; $obj = new stdclass; } test_global_ref(); var_dump($obj); test_global_noref(); var_dump($obj); ?> NULL object(stdClass)(0) { }
相关文章推荐
- 2.3.PHP7.1 女神级教程-女神的私人信息 -【PHP变量的作用域】
- 浅谈PHP变量作用域以及地址引用问题
- php变量作用域(花括号、global、闭包)
- php 变量及变量作用域
- PHP变量作用域
- 深入理解PHP原理之变量作用域(Scope in PHP)
- 谈谈php变量作用域
- php 全局变量global的作用域
- php变量作用域
- php中常量,变量的作用域和生存周期
- 彻底搞懂PHP的变量作用域和全局变量
- PHP开始啦--变量作用域,global关键词,static关键词
- php变量作用域
- PHP变量作用域(花括号、global、闭包)
- 浅析php变量作用域的一些问题
- php变量作用域
- [转]PHP变量的声明及其作用域&静态变量
- php闭包中使用use声明变量的作用域实例分析
- php闭包中use(变量)的作用域
- PHP变量作用域