статические методы (с ранним или поздним ограничением) создают тесную связь и (таким образом) снижают тестируемость. Вы можете создавать большие программы на PHP без использования нескольких статических вызовов. для меня поздние статические методы не являются особенностью.
изменить , чтобы ответить на вопрос Марко Демайо, как статический метод снижает тестируемость?
Прошу прощения, если это все очевидно для вас, статические члены (и данные, и методы) полезны и не наносят вреда, если используются ответственно, я имел в виду их распространенное злоупотребление.
скажем, у вас есть веб-приложение, которое использует базу данных SQL. Ваши бизнес-объекты могут извлекать данные, используя статический интерфейс или полиморфизм. либо
class MyBusinessObject
extends...
{
public function doThisOrThat(...)
{
$results = db::query('sql string...');
...
}
}
или
class MyBusinessObject
extends...
{
public function __construct(dbconn $db)
{
$this->db = $db;
}
private $db;
public function doThisOrThat(...)
{
$results = $this->db->query('sql string...');
...
}
}
последний легче протестировать (например: я хочу проверить, что строка sql, построенная из таких-то и таких-то входов, такая-то и такая-то), потому что проще создать другую реализацию интерфейса dbconn
, чем это изменить значение db::
. почему ты тоже хочешь? потому что вам не нужна настоящая база данных для проверки поведения составления sql, и на самом деле проще протестировать без реальной базы данных. Кроме того, проще заглушить потребителя sql, если ваши тесты связаны с другим аспектом CUT (тестируемого кода).
тестирование всегда подразумевает ложь тестируемому коду о его соавторах и воздержание от статических интерфейсов («двойной столб» или «квадридот») означает, что ложь не должна быть массовой операцией, что является плюсом, поскольку чем дальше тестируемый код из производственного кода, тем менее значимы результаты теста.