2012-05-14 50 views
0

我有一個類的應用程序與靜態和非靜態變量。如何覆蓋靜態變量?

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!

謝爾蓋的帖子後:

,我很困惑這是最面向對象的方式做這樣的事情,而最有效的(速度/內存)?

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 
+0

a。將變量聲明爲傀儡 - 效率最高,如果要更改它,則使用statis變量,如果不是,則將const用於代碼。 – Sergey

回答

0

其實你在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'; 
} 

這樣的記事本:: getAppName()將返回 '記事本'; 更多信息here

+0

完美的坦克你! – Johntor

0

功能getAppName()如果你想overrided值呼籲App類和自:: $ APPNAME點到App :: $ APPNAME 你必須寫,如:

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

謝謝你的快速回答。沒有重新聲明getAppName()沒有辦法? – Johntor

1

我想我找到了更好的解決方案

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

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

現在它的工作方式應該是這樣!

+0

這是一個偉大的工作! – Sergey