2014-11-04 2 views
2

У меня относительно простой вопрос, и хотя в 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

ни. У меня был бы «холодильник», в котором хранится коллекция «Food» (и, возможно, «Drink» и т. Д.) – kero

+0

@developerwjk.Что, если статическая функция в примере 1 имела код для извлечения продуктов из базы данных. Это похоже на то, что я на самом деле пытаюсь достичь. – Typhoon101

+0

В этом случае я думаю, что вы должны называть метод 'getAllFoodFromDB()', чтобы избежать путаницы с 'getAllFood()' из экземпляра класса. – developerwjk

ответ

1

В этом случае вы должны пойти с примером 2, потому что вы пытаетесь сделать в примере 1 не будет работать:

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

Не будет возврата пищи, если в классе не будет жесткого кода. Что вы вложили в конструктор, вы помещаете в экземпляр в $food. Но вы вызываете сам класс Food::getAllFood() для извлечения. Это не имеет смысла.

Есть ли случаи, когда было бы целесообразно включить статический метод в класс? Да. Например, если я создаю класс соединения db, который будет поддерживать соединение, но я также хотел бы разоблачить некоторые методы формата даты, относящиеся к конкретной СУБД, но на самом деле не требует подключения к db для активации. Все, что прикасаясь к БД должно быть не статичными, но некоторые методы преобразования на данном я уже вытащил может быть статичными:

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

В этом случае вы можете сделать это, чтобы обеспечить преобразование без необходимости не экземпляр объекта БД, потому что, возможно, вы, возможно, потребуется преобразовать назад и вперед между так называемым форматом Julian JDE и регулярные даты, прежде чем даже определить, требуется ли подключение к БД:

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

Q: это приемлемо для смешивания статические и нестатические методы в классе?

: Конечно, до тех пор, как:

1) Вы действительно чувствуете, оба метода логически принадлежат к тому же классу, и

2) Статический метод (ы) может/должно быть названо независимым от любой экземпляр класса.

Лучшее эмпирическое правило заключается в использовании статических методов, когда вызов действительно без гражданства.

Вот хорошее обсуждение: