您的位置:首页 > 编程语言 > PHP开发

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 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: