Допустимо ли смешивать статические и нестатические методы в одном классе?

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

Решение

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

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

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

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

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

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

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

Другие решения

В: Допустимо ли смешивать статические и нестатические методы в классе?

A: Конечно, пока:

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

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

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

Вот хорошая дискуссия:

4

По вопросам рекламы [email protected]