У меня есть относительно простой вопрос, и хотя в 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, потому что то, что вы пытаетесь сделать в примере 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');
В: Допустимо ли смешивать статические и нестатические методы в классе?
A: Конечно, пока:
1) Вы действительно чувствуете, что оба метода логически принадлежат одному и тому же классу, и
2) Статический метод (ы) можно / нужно вызывать независимо от любого экземпляра класса.
Лучшее практическое правило — использовать статические методы, когда вызов действительно не имеет состояния.
Вот хорошая дискуссия: