9

所以我最近遇到了这样的代码段:

private static function FOO() {
        static $c = null;
        if ($c == null) {
            $c = new ParentClass_InnerClass();
        }
        return $c;
    }

那么这段代码是怎么回事呢?这与以下有何不同:

private static $C;

//other methods and fields    

private static function FOO() {
    if(!$self::c) {
        $self::c = new ParentClass_InnerClass();
    }
    return $self::c;
}

或者他们甚至是同一个概念?

4

3 回答 3

8

它们本质上是相同的概念,尽管范围不同:

class Foobar
{
    private static $c = null;
    public static function FOO()
    {
        if (self::$c === null)
        {
            self::$c = new stdClass;
        }
        return self::$c;
    }
    public static function checkC()
    {
        if (self::$c === null)
        {
            return false;
        }
        return self::$c;
    }
}

Foobar::checkC();//returns false, as $c is null
//function checkC has access to $c
$returned = Foobar::FOO();//returns object
if ($returned === Foobar::checkC())
{//will be true, both reference the same variable
    echo 'The same';
}

然而,如果我们将代码更改为:

class Foobar
{
    public static function FOO()
    {
        static $c = null;
        if ($c === null)
        {
            $c = new stdClass;
        }
        return $c;
    }
    public static function checkC()
    {
        if ($c === null)
        {
            return false;
        }
        return $c;
    }
}

checkC调用: undefined variable时我们会收到通知。静态变量 $c 只能从范围内访问FOO。私有属性的范围是整个类。就是这样。
但实际上,帮自己一个忙:仅在需要时才使用静态(它们也在实例之间共享)。在 PHP 中,您实际上很少需要静态。

于 2013-10-24T15:23:54.037 回答
7

它们是相同的概念,除了在第一个代码块中,静态变量是函数的局部变量,这样的静态变量可以在任何函数中使用,甚至在类的上下文之外:

function test() {
    static $counter = 0;
    return $counter++;
}

echo test(); // 0
echo test(); // 1
于 2013-10-24T15:16:17.553 回答
1

在顶部示例中,您$c只能从本地范围 ( FOO()) 访问,而在底部示例中,您可以$c从整个类访问,因此不仅是 form FOO()

于 2013-10-24T15:16:26.710 回答