在一个类中混合使用静态方法和非静态方法是否可以接受?

问题描述:

我有一个相对简单的问题,虽然在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

在这种情况下,你必须去与例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'); 

问:它接受混合类中的静态和非静态方法?

答:当然可以,只要:

1)您真正感受到这两种方法在同一类逻辑上属于和

2)静态方法(S)可以/应该被称为独立的任何类实例。

最好的经验法则是当调用是无状态时使用静态方法。

这里有一个很好的讨论: