php 函数变量的作用域 两个关键词global 和static
2016-05-04 18:19
429 查看
2.7.4 函数变量的作用域
为了让读者理解作用域的概念,下面通过两段代码来说明。
<?php
$a = 1; /* 全局参数 */
function Test()
{
echo $a; /* 本地参数 */
}
Test();
?>
以上脚本不会有任何输出,因为echo 语句引用了一个局部版本的变量$a,而且在这个范
围内,它并没有被赋值。读者可能注意到PHP 的全局变量和C 语言有一点不同,在C 语言
中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能
漫不经心的改变一个全局变量。PHP 中全局变量在函数中使用时必须声明为全局。
如下面的代码:
<?php
function Test()
{
$a=110;
}
Echo $a;
?>
同理,以上代码也不会有任何输出。因为$a 是在一个函数中被赋值的,其作用域只有在
函数的内部,当在函数外部访问该变量的时候,是无法访问的。
虽然变量的作用域限制了变量的访问能力。但是还是可以从函数外部,访问函数内部的
变量,从而使得脚本更加灵活以及动态性能更好。PHP 允许使用两个关键词global 和static
来实现这一点。
1.Global 语句
Global 语句允许从脚本的任何位置访问函数内部定义的变量以及从函数内部访问函数意
外的变量。因此在声明变量时,必须在变量前面加上global 关键字。
实例2-68 使用全局变量
本实例演示如何使用一个已经声明的全局变量,如代码2-72 所示。
【代码2-72】 global_1.php
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b; //必须使用global 关键字声明
$b = $a + $b;
}
Sum();
echo $b; //输出结果3
?>
以上脚本的输出将是3。在函数中声明了全局变量$a 和$b,任何变量的所有引用变量都
会指向到全局变量。对于一个函数能够声明的全局变量的最大个数,PHP 没有限制。
在全局范围内访问变量的第二个方法,是用特殊的PHP 自定义$GLOBALS 数组。
实例2-69 使用$GLOBALS 数组
本实例演示如何通过$GLOBALS 全局变量数组来获取全局变量值,如代码2-73 所示。
【代码2-73】 global_2.php
<?php
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum();
echo $b; //返回3
?>
2.Static 语句(静态变量)
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存
在,当程序执行离开此作用域时,其值并不丢失。
看看下面的例子:
<?php
function Test ()
{
$a = 0;
echo $a;
$a++;
}
?>
本函数没什么用处,因为每次调用时都会将$a 的值设为0 并输出“0”。将变量加1 的$a++
没有作用,因为一旦退出本函数则变量$a 就不存在了。
要写一个不会丢失本次计数值的计数函数,要将变量$a 定义为静态的:
<?php
function Test()
{
static $a = 0;
echo $a;
$a++;
}
?>
这样,每次调用Test()函数都会输出$a 的值并加1。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> static.php </title>
<meta charset="UTF-8">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<?php
function Test()
{
static $a = 0;
echo $a;
$a++;
}
Test();
Test();
Test();
Test();
?>
</body>
</html>
0123
为了让读者理解作用域的概念,下面通过两段代码来说明。
<?php
$a = 1; /* 全局参数 */
function Test()
{
echo $a; /* 本地参数 */
}
Test();
?>
以上脚本不会有任何输出,因为echo 语句引用了一个局部版本的变量$a,而且在这个范
围内,它并没有被赋值。读者可能注意到PHP 的全局变量和C 语言有一点不同,在C 语言
中,全局变量在函数中自动生效,除非被局部变量覆盖。这可能引起一些问题,有些人可能
漫不经心的改变一个全局变量。PHP 中全局变量在函数中使用时必须声明为全局。
如下面的代码:
<?php
function Test()
{
$a=110;
}
Echo $a;
?>
同理,以上代码也不会有任何输出。因为$a 是在一个函数中被赋值的,其作用域只有在
函数的内部,当在函数外部访问该变量的时候,是无法访问的。
虽然变量的作用域限制了变量的访问能力。但是还是可以从函数外部,访问函数内部的
变量,从而使得脚本更加灵活以及动态性能更好。PHP 允许使用两个关键词global 和static
来实现这一点。
1.Global 语句
Global 语句允许从脚本的任何位置访问函数内部定义的变量以及从函数内部访问函数意
外的变量。因此在声明变量时,必须在变量前面加上global 关键字。
实例2-68 使用全局变量
本实例演示如何使用一个已经声明的全局变量,如代码2-72 所示。
【代码2-72】 global_1.php
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b; //必须使用global 关键字声明
$b = $a + $b;
}
Sum();
echo $b; //输出结果3
?>
以上脚本的输出将是3。在函数中声明了全局变量$a 和$b,任何变量的所有引用变量都
会指向到全局变量。对于一个函数能够声明的全局变量的最大个数,PHP 没有限制。
在全局范围内访问变量的第二个方法,是用特殊的PHP 自定义$GLOBALS 数组。
实例2-69 使用$GLOBALS 数组
本实例演示如何通过$GLOBALS 全局变量数组来获取全局变量值,如代码2-73 所示。
【代码2-73】 global_2.php
<?php
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum();
echo $b; //返回3
?>
2.Static 语句(静态变量)
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存
在,当程序执行离开此作用域时,其值并不丢失。
看看下面的例子:
<?php
function Test ()
{
$a = 0;
echo $a;
$a++;
}
?>
本函数没什么用处,因为每次调用时都会将$a 的值设为0 并输出“0”。将变量加1 的$a++
没有作用,因为一旦退出本函数则变量$a 就不存在了。
要写一个不会丢失本次计数值的计数函数,要将变量$a 定义为静态的:
<?php
function Test()
{
static $a = 0;
echo $a;
$a++;
}
?>
这样,每次调用Test()函数都会输出$a 的值并加1。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> static.php </title>
<meta charset="UTF-8">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<?php
function Test()
{
static $a = 0;
echo $a;
$a++;
}
Test();
Test();
Test();
Test();
?>
</body>
</html>
0123
相关文章推荐
- php变量函数
- php 函数返回值 return
- PHP 7.0.0 正式发布,速度是 PHP 5.6 的两倍
- php下载地址
- 乌班图下配置PHP运行环境
- PHP读取目录树
- php 实现(非递归,栈模拟)二叉树的先序、中序、后序
- thinkPHP快速创建验证码
- THINKPHP快速创建分页
- 使用vs code写php及调试
- header("Location:login.php")
- jetty9配置contextPath
- PHP Fatal error问题处理
- PHP 实现(递归)二叉树的先序、中序、后序
- Ajax复选框多选删除的实现
- nctf-php
- PHP 实现代码复用的一个方法 traits新特性
- 用扩展开发一个PHP类
- PHP之命名空间
- 简单好用的时间插件laydate实现开始时间和结束时间的限制