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

时间:2014-11-04 23:23:40

标签: php class static-functions

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

答案 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');