5

我有一个相对简单的问题,虽然谷歌上有很多关于它的帖子,但我找不到一个简单回答这个问题的帖子。

所以简短的问题是“在一个类中混合静态和非静态方法是否可以接受?”。我想我真的在问“坚持使用一种方法是一种好习惯”,还是“同时使用这两种方法时有什么要考虑的事情”。

例如,如果我正在创建一个类来处理冰箱里的食物,那么以下哪个(或其他)是最好的方法

示例 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();

提前致谢

4

2 回答 2

7

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

答:当然可以,只要:

1) 你真的觉得这两种方法在逻辑上属于同一个类,并且

2) 可以/应该独立于任何类实例调用静态方法。

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

这是一个很好的讨论:

于 2014-11-04T23:26:58.810 回答
5

在这种情况下,您必须使用示例 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 格式和常规日期之间来回转换,甚至在确定是否需要连接到D b:

$date = JDE_DBClass::convertJDE_Date_to_PHP_Date('114309');
于 2014-11-04T23:38:53.063 回答