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

问题描述:

I have a relatively simple question, and although there are many posts about it on Google, I cannot find a single one that simply answers the question.

So the short question is "Is it acceptable to mix static and non static methods in one class?". I guess I am really asking "is it good practice to stick with one type of method", or "are there things to consider when using both".

For example, If I was building a class to cope with food in my fridge, which of the following (or what else) would be the best approach

Example 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();

Or Example 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();

Thanks in advance

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

所以简短的问题是“在一个类中混合静态和非静态方法是否可以接受?”。 我想我真的在问“坚持使用一种方法是不错的做法”,或者“使用两种方法时都需要考虑”。 p>

例如,如果我正在建设 一个应付冰箱食物的课程,以下哪一项(或其他什么)是最好的方法 p>

示例1: p>

  Class Food 
 {
 public function __construct($ itemName,$ itemDescription)
 {
 ...... ....新食物的一些代码.... 
} 
 
公共静态函数 getAllFood()
 {
 ......一些代码可以获取我冰箱里的所有物品.... 
} 
} 
 
 $ food = new Food(“apple”,“Nice juicy Pink  Lady apple“); 
Food :: getAllFood(); 
  code>  pre> 
 
 

或示例2: p>

  Class Food  
 {
公共函数__construct($ itemName,$ itemDescription)
 {
 ......一些新食物的代码.... 
} 
 
公共函数getAllFood()
  {
 ......一些代码可以获取我冰箱里的所有物品.... 
} 
} 
 
 $ food = new Foo  d(“apple”,“Nice juicy Pink Lady apple”); 
 $ food-> getAllFood(); 
  code>  pre> 
 
 

提前致谢 p> div>

In this case you have to go with example 2, because what you're trying to do in example 1 will not work:

$food = new Food( "apple", "Nice juicy Pink Lady apple" );
Food::getAllFood(); //static

There will not be any food returned unless there's some hardcoded in the class. What you put in with the constructor, you put into the instance in $food. But you're calling the class itself Food::getAllFood() to retrieve. That doesn't make sense.

Are there cases where it would make sense to include a static method in a class? Yes. Like if I was making a db connection class that would hold a connection, but I also wanted to expose some date format methods that are related to the particular DBMS but don't actually require the connection to the db to be active. Anything touching the db would have to be non-static, but some transformation methods on data I've already pulled out could be static:

$db = new JDE_DBClass($connectionString);
$rows = $db->doSelectQuery("select * from whatever");
$date = JDE_DBClass::convertJDE_Date_to_PHP_Date($rows[0]['dateField']);

In this case you might want to do this to allow conversion without having to instantiate the db object, because perhaps you might need to convert back and forth between JDE's so-called Julian format and regular dates before even determining whether you need to connect to the db:

$date = JDE_DBClass::convertJDE_Date_to_PHP_Date('114309');

Q: Is it acceptable to mix static and non-static methods in a class?

A: Sure, as long as:

1) You truly feel both methods logically belong in the same class, and

2) The static method(s) can/should be called independent of any class instance.

The best rule of thumb is to use static methods when the call is truly stateless.

Here's a good discussion: