Никакого отношения сингелтону этот код не имеет.
с какой целью его автор создает экземпляр объекта в статичном методе
У этого приема много названий. По сути это статический метод-фабрика, еще можно встретить "именованный конструктор".
class User {
private function __construct($email, $password) { /* ... */}
public static function create($email, $password) {
return new static($email, $password);
}
public static function createWithProfile($email, $password, UserProfile $profile) {
$user = static::create($email, $password);
$user->profile = $profile;
return $user;
}
}
$user1 = User::create('example@example.com', 'example');
$user2 = User::createWithProfile('example@example.com', 'example', new UserProfile(
$firstName, $lastName, $avatar /* ... */
));
Основная идея тут - сделать возможность задания последовательности действий, и при этом запретить пользовательскому коду эту последовательность как-то нарушить. Все для того что бы ограничить человека от возможных ошибок.
Отличие тут в том что мы не возвращаем экземпляр класса, он однаразовый. Только для этой последовательности.
Почему бы не сделать так, спросите вы:
(new Reboot())->reboot();
Потому что нам не нужен этот инстанс. Функция reboot ничего не должна вернуть, а объект который создается - одноразовый. Почему так - надо смотреть в контексте. При работе с процессами я могу придумать десяток кейсов когда это надо.
По сути можно было бы спокойно сделать это обычной функцией, но автор посчитал что так будет читабельнее. Говнокод часть тут только имя класса - Reboot. Имена классов, интерфейсов и т.д. должны быть существительными. Мы описываем тип объектов. Но это единственное место к которому я могу придраться.