2013-06-22 71 views
2
protected static $table = array(
      'createQuery' => 'CREATE TABLE IF NOT EXISTS `xf_user_notes` (
      `note_id` int(10) NOT NULL AUTO_INCREMENT, 
      `given_user_id` int(10) NOT NULL, 
      `received_user_id` int(10) NOT NULL, 
      `note_message` VARCHAR(255) NOT NULL, 
      `note_date` int(11) NOT NULL, 
       PRIMARY KEY (`note_id`) 
     ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;', 
      'dropQuery' => 'DROP TABLE IF EXISTS `xf_user_notes`' 
    ); 

以上代碼取自一個網站。如何在php中使用受保護的靜態?

問:

我知道:保護只能在類本身和繼承和家長classes.static使他們無需類的實例訪問的訪問。但通常在哪種情況下我們使用受保護的靜態?誰能給我一個生動的例子?謝謝。

+0

靜態方法通常只不過是輔助方法,你可能不想公開代碼。 –

+0

請參閱http://kunststube.net/static,最後三分之一。 – deceze

+0

您是否閱讀過使用Google搜索「在哪種情況下使用受保護的靜態」(您自己的措辭)的衆多頁面? – mzedeler

回答

0

引用自己從here

靜態類屬性是靜態數據有用。也就是說,類實例所依賴的數據 ,但它永遠不會改變,並且可能是 很大。完全假設的例子:

class Database { 

    protected static $types = array(
     'int' => array('internalType' => 'Integer', 'precision' => 0,  ...), 
     'string' => array('internalType' => 'String', 'encoding' => 'utf-8', ...), 
     ... 
    ) 

} 

假設這個數據庫類需要做不同類型的 數據從數據庫和地圖數據庫類型來 內部類型的東西。要做到這一點,它需要一個類型映射。該地圖始終是 ,對於Database的每個實例都是相同的,並且由幾種方法使用 Database。那麼,爲什麼不使它成爲static財產,這是從來沒有 修改,但只有讀過?它節省了一點點的內存,因爲數據在Database的所有實例之間共享。由於 數據只能從類內部訪問,因此此 不會創建任何外部依賴關係。靜態屬性 永遠不會公開訪問,因爲它們只是全局變量 。我們已經看到了......

靜態屬性也可能有助於緩存一些類別的所有實例相同的數據,一旦它被計算出來,並且可以很容易地在實例間優化共享。有些 這樣的情況下,這是有用的。靜態屬性主要是 提供了一種優化技術,他們不應該被看作是編程理念。

+0

看來你主要談論靜態,那麼'受保護靜態'怎麼樣?你能舉一個簡單的例子嗎? – user2507818

+0

* protected * static沒有什麼特別之處。代碼示例顯示了'protected static'。相反,'public static'只是一個全局變量,應該避免。 – deceze

0

非靜態方法不能在靜態方法內調用(不需要實例化類)。受保護的靜態會使其無法從外部類訪問,但仍可從公共靜態方法訪問。這可能是將複雜的代碼部分分解爲更易維護的塊,或者如果在另一個靜態方法中存在狹義的重用。

+0

你能給我一個更好理解的例子嗎? – user2507818

相關問題