我有一个相对简单的问题,虽然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 :(得分:4)
问:在类中混合使用静态和非静态方法是否可以接受?
答:当然,只要:1)你真的觉得这两种方法在逻辑上都属于同一个类,而且
2)可以/应该独立于任何类实例调用静态方法。
最好的经验法则是在呼叫真正无状态时使用静态方法。
这是一个很好的讨论:
答案 1 :(得分:1)
在这种情况下,您必须使用示例2,因为您在示例1中尝试执行的操作不起作用:
$food = new Food( "apple", "Nice juicy Pink Lady apple" );
Food::getAllFood(); //static
除非课堂上有一些硬编码,否则不会有任何食物归还。您在构造函数中添加了什么,将其放入$food
中的实例中。但是你要调用类本身Food::getAllFood()
来检索。这没有意义。
是否存在在类中包含静态方法有意义的情况?是。就像我正在创建一个可以保持连接的数据库连接类一样,但是我也希望公开一些与特定DBMS相关的日期格式方法,但实际上并不要求与数据库的连接是活动的。任何触及数据库的东西都必须是非静态的,但是我已经提取的数据的一些转换方法可能是静态的:
$db = new JDE_DBClass($connectionString);
$rows = $db->doSelectQuery("select * from whatever");
$date = JDE_DBClass::convertJDE_Date_to_PHP_Date($rows[0]['dateField']);
在这种情况下,您可能希望这样做以允许转换而无需实例化db对象,因为您可能需要在JDE的所谓Julian格式和常规日期之间来回转换,甚至在确定是否需要之前连接到db:
$date = JDE_DBClass::convertJDE_Date_to_PHP_Date('114309');