2014-11-04 126 views
2

我有一個相對簡單的問題,雖然在Google上有很多關於它的文章,但我找不到一個簡單回答問題的文章。在一個類中混合使用靜態方法和非靜態方法是否可以接受?

所以簡短的問題是「在一個類中混合靜態和非靜態方法是否可以接受?」。我想我真的在問:「堅持一種方法是好的做法」,還是「在使用這兩種方法時需要考慮的事情」。

例如,如果我是建設一類的食物,以應付在我的冰箱,其下面(或者什麼的)會是最好的方法

例1:

Class Food 
{ 
    public function __construct($itemName, $itemDescription) 
    { 
     .... some code for a new item of food .... 
    } 

    public static function getAllFood() 
    { 
     .... some code to get all the items in my fridge .... 
    } 
} 

$food = new Food("apple", "Nice juicy Pink Lady apple"); 
Food::getAllFood(); 

或者實施例2:

Class Food 
{ 
    public function __construct($itemName, $itemDescription) 
    { 
     .... some code for a new item of food .... 
    } 

    public function getAllFood() 
    { 
     .... some code to get all the items in my fridge .... 
    } 
} 

$food = new Food("apple", "Nice juicy Pink Lady apple"); 
$food->getAllFood(); 

預先感謝

+0

都不是。我會有一個「冰箱」,裏面收藏着「食物」(也可能是「飲料」等) – kero 2014-11-04 23:26:26

+0

@developerwjk。如果示例1中的靜態函數有代碼從數據庫中檢索食物項,該怎麼辦?這與我實際嘗試實現的情況類似。 – Typhoon101 2014-11-04 23:42:59

+0

在這種情況下,我認爲你應該命名方法'getAllFoodFromDB()'以避免與類的實例中的'getAllFood()'混淆。 – developerwjk 2014-11-04 23:48:58

回答

1

在這種情況下,你必須去與例2,因爲你想例如,在做什麼1將不起作用:

$food = new Food("apple", "Nice juicy Pink Lady apple"); 
Food::getAllFood(); //static 

除非班上有一些硬編碼,否則不會有任何食物返回。你在構造函數中放入了什麼,你把它放入$food的實例中。但是你要叫這個類本身Food::getAllFood()來檢索。這沒有意義。

有沒有情況下在類中包含一個靜態方法是有意義的?是。就好像我正在創建一個可以存放連接的db連接類,但我也想公開一些與特定DBMS相關的日期格式方法,但實際上並不需要連接到db來激活。任何物體觸碰數據庫必須是非靜態的,但對數據的一些變換方法我已經拿出可以是靜態的:

$db = new JDE_DBClass($connectionString); 
$rows = $db->doSelectQuery("select * from whatever"); 
$date = JDE_DBClass::convertJDE_Date_to_PHP_Date($rows[0]['dateField']); 

在這種情況下,你可能想這樣做是爲了讓轉換,而無需實例的db對象,因爲也許你可能需要甚至決定你是否需要連接到數據庫之前來回JDE的所謂朱利安格式和定期日期之間轉換:

$date = JDE_DBClass::convertJDE_Date_to_PHP_Date('114309'); 
3

問:它接受混合類中的靜態和非靜態方法?

答:當然可以,只要:

1)您真正感受到這兩種方法在同一類邏輯上屬於和

2)靜態方法(S)可以/應該被稱爲獨立的任何類實例。

最好的經驗法則是當調用是無狀態時使用靜態方法。

這裏有一個很好的討論:

相關問題