变量范围
变量的范围即它定义的上下文背景,也就是它的生效范围。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了引入的文件。
<?php
require __DIR__ . '/example.php';
var_dump($foo); // string(3) "foo"
上例中的 example.php
文件内容:
<?php
$foo = 'foo';
在用户自定义函数中,一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。
<?php
/**
* Try to return a variable from the function.
*
* @param void
* @return void
*/
function foo()
{
return $foo;
}
$foo = 'foo';
var_dump(foo()); // NULL
PHP 中全局变量在函数中使用时必须将变量声明为 global
,在函数中声明了全局变量之后,对任一变量的所有引用都会指向其全局版本。
<?php
/**
* Use global variables in function.
*
* @param void
* @return string
*/
function foo(): string
{
global $foo;
return $foo;
}
$foo = 'foo';
var_dump(foo()); // string(3) "foo"
在局部函数范围内访问全局变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS
数组。 $GLOBALS
是一个关联数组,每一个变量为一个元素,键名对应变量名,值对应变量的内容。 $GLOBALS
之所以在全局范围内存在,是因为 $GLOBALS
是一个超全局变量。
<?php
/**
* Use superglobal variables in function.
*
* @param void
* @return string
*/
function foo(): string
{
return $GLOBALS['foo'];
}
$foo = 'foo';
var_dump(foo()); // string(3) "foo"
变量范围的另一个重要特性是静态变量。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
<?php
/**
* Use static variables in function.
*
* @param void
* @return int
*/
function foo(): int
{
static $foo = 0;
return $foo++;
}
var_dump(foo()); // int(0)
var_dump(foo()); // int(1)
var_dump(foo()); // int(2)
静态变量也提供了一种处理递归函数的方法。递归函数是一种调用自己的函数。写递归函数时要小心,因为可能会无穷递归下去。必须确保有充分的方法来中止递归。
<?php
/**
* Use static variables in recursive function.
*
* @param void
* @return void
*/
function foo()
{
static $foo = 0;
$foo++;
if ($foo < 10) {
foo();
}
}
foo();