Более сложная проверка - причина, но не единственная.Статические методы обеспечивают глобальный доступ, а глобальный доступ плохой.
Конечно, вы обнаружите, что есть еще один глобальный доступ к объектам, и он создается с «новым».Объекты должны быть созданы где-то, поэтому мы не можем устранить это (хотя свести к минимуму это хорошая идея).Статические методы, так как глобальный доступ к классу плох, если только он не заменяет «новый» посредством программирования более высокого уровня:
$user = new User();
$user->setPointsTo(100);
// vs
$user = User::with100StartingPoints();
В этом случае я создал код, который будет более читабельным, при этом не злоупотребляя глобальным доступом («новый» нужно было вызывать в любом случае).
Редактировать: Позвольте мне привести вам пример того, как статические методы «могут» быть смертью тестируемости (обратите внимание, что в приведенном выше примере вы даже ненужно издеваться над статическим методом, но можно легко протестировать новый и статический метод дает тот же результат).Давайте воспользуемся вашим примером регистратора:
class Logger {
public static function log($text) { // etc }
}
class AccessControl {
public function isAllowed(User $user, $action) {
// do stuff, determine if $allowed
if (!$allowed) {
Logger::log('user X was not allowed to do Y');
}
// do stuff
}
}
Нет способа, которым мы могли бы протестировать этот метод чисто из-за глобального вызова Logger :: log.Это будет зависеть от правильной работы класса Logger.