Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何覆盖静态变量?_Php_Static - Fatal编程技术网

Php 如何覆盖静态变量?

Php 如何覆盖静态变量?,php,static,Php,Static,我有一个带有静态和非静态变量的类应用程序 class App{ protected static $appName = 'dummy'; protected $appIcon = 'icon'; public static function getAppName() { return self::$appName; } } 然后我像这样扩展这个类 class Notepad extends App{ private static $ap

我有一个带有静态和非静态变量的类应用程序

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(),但它总是返回dummy

有什么想法或建议吗

提前谢谢

J

在谢尔盖的职位之后:

我在想,哪种OOP方式最适合做这样的事情,哪种方式最有效(速度/内存)

函数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;
    }
}

我想我找到了更好的解决办法

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

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

现在它的工作方式应该是

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

我改变了你的例子:

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”;
更多信息。

感谢您的快速回答。如果不重新声明getAppName()?a,就没有办法了。将变量声明为puplic是最有效的方法,如果您想更改它,请使用statis variable;如果不想更改,请使用const作为代码。
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';
}