如何覆盖静态变量?

时间:2012-05-14 11:42:02

标签: php static

我有一个包含静态和非静态变量的类App。

class App{
    protected static $appName = 'dummy';
    protected $appIcon = 'icon';

    public static function getAppName() {
        return self::$appName;
    }
}

然后我像这样扩展这个类

class Notepad extends App{
    private static $appName = 'notepad';
    private $appIcon = 'notepad_icon';
}

我希望在不创建记事本实例的情况下获取appName。我试过Notepad :: getAppName(),但这总是返回虚拟。

任何想法或建议???

提前致谢!

J 1

在谢尔盖的帖子之后:

我在徘徊,这是最像这样做的OOP方式,也是最有效的(速度/记忆)?

a. declaring variables as puplic

b. creating an instance of an object just to get a few variables

c. rewrite the static function to all the children classes as Sergey suggested

3 个答案:

答案 0 :(得分:1)

我认为我找到了更好的解决方案

class App{
    protected static $appName = 'dummy';
    protected $appIcon = 'icon';

    public static function getAppName() {
        $c = get_called_class();
        return $c::$appName;
    }
}

现在它按照它应该的方式工作!!!

答案 1 :(得分:0)

函数getAppName()调用App类,self :: $ appName指向App :: $ appName 如果你想要覆盖价值,你必须写成:

class Notepad extends App{
    protected static $appName = 'notepad';
    protected $appIcon = 'notepad_icon';
    public static function getAppName() {
        return self::$appName;
    }
}

答案 2 :(得分:0)

实际上你在php>中有一个新关键字“static” 5.3。

我改变了你的榜样:

class App{
    protected static $appName = 'dummy';
    protected $appIcon = 'icon';

    public static function getAppName() {
        return static::$appName;
    }
}

class Notepad extends App{
    protected static $appName = 'notepad';
    protected $appIcon = 'notepad_icon';
}

这样Notepad :: getAppName()将返回'notepad'; 更多信息here