变量范围

变量的范围即它定义的上下文背景,也就是它的生效范围。大部分的 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();

results matching ""

    No results matching ""