在一个类中混合使用静态方法和非静态方法是否可以接受?
问题描述:
我有一个相对简单的问题,虽然在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();
预先感谢
答
在这种情况下,你必须去与例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)可以/应该被称为独立的任何类实例。
最好的经验法则是当调用是无状态时使用静态方法。
这里有一个很好的讨论:
都不是。我会有一个“冰箱”,里面收藏着“食物”(也可能是“饮料”等) – kero 2014-11-04 23:26:26
@developerwjk。如果示例1中的静态函数有代码从数据库中检索食物项,该怎么办?这与我实际尝试实现的情况类似。 – Typhoon101 2014-11-04 23:42:59
在这种情况下,我认为你应该命名方法'getAllFoodFromDB()'以避免与类的实例中的'getAllFood()'混淆。 – developerwjk 2014-11-04 23:48:58