从child->子类php访问静态变量

时间:2010-08-02 21:30:16

标签: php oop static static-variables

我有以下设置:

<?php
class core {
    static $var1;
}

class parent extends core {
   function getStatic() {
       return parent::$var1;
   }
}

class child extends parent {
    function getStatic() {
        // I want to access core static var, how can i do it?
        //return parent::$var1;
   }
}
?>

我需要能够使用parent :: $ var1但是来自class child ..这可能吗?我错过了什么吗?

3 个答案:

答案 0 :(得分:4)

只需将其引用为self ... PHP将自动进入继承链,直到找到匹配项

class core {
    protected static $var1 = 'foo';
}
class foo extends core {
    public static function getStatic() {
        return self::$var1;
    }
}
class bar extends foo {
    public static function getStatic() {
        return self::$var1;
    }
}

现在,如果您未在bar中声明getStatic,则会出现问题。我们来举个例子:

class foo1 extends core {
    protected static $var1 = 'bar';
    public static function getStatic() {
        return self::$var1;
    }
}
class bar1 extends foo1 {
    protected static $var1 = 'baz';
}

现在,您希望foo1::getStatic()返回bar(它会)。但Bar1::getStatic()将返回什么?它也将返回bar。这称为后期静态绑定。如果您希望它返回baz,则需要使用static::$var1而不是self::$var1(仅限PHP 5.3+)...

答案 1 :(得分:2)

core :: $ var1似乎最适合您的需求......

答案 2 :(得分:1)

这里最大的问题是您使用关键字parent作为类名。这使得对parent :: $ var1的调用是否旨在指向该类或调用类的父类是完全不明确的。

我相信,如果你清理它,你可以实现你想要的。例如,此代码打印'某事'。

class core {
    static $var1 = 'something';
}

class foo extends core {
   function getStatic() {
       return parent::$var1;
   }
}

class bar extends foo {
    function getStatic() {
        // I want to access core static var, how can i do it?
        return parent::$var1;
   }
}

$b = new bar ();
echo $b->getStatic ();

如果您使用core::代替parent::,它也会有效。但是,如果在foo类中声明静态$ var1,那么这两个 的行为会有所不同。因为它是一个单一的,继承的变量。