变量的作用域和静态变量
1.全局变量 :global 关键字
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
//Example #2 使用 $GLOBALS 替代 global
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Sum();
echo $b;
$GLOBALS 是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。以下范例显示了超全局变量的用处:
2.静态变量
变量范围的另一个重要特性是静态变量(static variable)。
静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
仅初始化一次
初始化时需要赋值
可以记录函数的调用次数,从而可以在某些条件下终止递归
看看下面的例子:
//Example #5 使用静态变量的例子
function test()
{
static $a = 0;
echo $a;
$a++;
}
现在,变量 $a 仅在第一次调用 test() 函数时被初始化,之后每次调用 test() 函数都会输出 $a 的值并加一。
静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。以下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止:
//Example #6 静态变量与递归函数
function test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
3.函数参数以及参数的引用传递
默认情况下,函数的参数通过值传递
如果希望允许函数修改它的值,必须通过引用的传递参数
通过引用传递参数
默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。
如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面加上符号 &:
//Example #2 用引用传递函数参数
function add_some_extra(&$string)
{
$string .= 'and something extra.';
}
$str = 'This is a string, ';
add_some_extra($str);
echo $str; // outputs 'This is a string, and something extra.'
4.函数的返回值
值通过使用可选的返回语句return返回
可以返回包括数组和对象的任意类型
返回语句会终止函数执行,将控制权交回函数调用处
省略return,返回值为null,不可有多个返回值
5.函数的引用返回
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&
function &myfunc()
{
static $b = 10;
return $b;
}
$a = myfunc();
$a = &myfunc(); //将$a 指向函数的返回值
$a = 100;
echo myfunc();
6.例题:写出下列程序的值?
$var1 = 5;
$var2 = 10;
function foo(&$my_var)
{
global $var1;
$var1 += 2;
$var2 = 4;
$my_var += 3;
return $var2;
}
$my_var = 5;
echo foo($my_var)."\n"; //4
echo $my_var."\n"; //8
echo $var1."\n"; //7
echo $var2."\n"; //10
$bar = 'foo';
$my_var = 10;
echo $bar($my_var)."\n"; //4