# 变量范围

变量的范围即它定义的上下文背景，也就是它的生效范围。大部分的 PHP 变量只有一个单独的范围。这个单独的范围跨度同样包含了引入的文件。

```php
<?php

require __DIR__ . '/example.php';
var_dump($foo); // string(3) "foo"

```

上例中的 `example.php` 文件内容：

```php
<?php

$foo = 'foo';

```

在用户自定义函数中，一个局部函数范围将被引入。任何用于函数内部的变量按缺省情况将被限制在局部函数范围内。

```php
<?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
<?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
<?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
<?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
<?php

/**
 * Use static variables in recursive function.
 *
 * @param  void
 * @return void
 */
function foo()
{
    static $foo = 0;
    $foo++;
    if ($foo < 10) {
        foo();
    }
}

foo();

```

