Какой тип должен быть возвращаемым для getInstance()?

123
28 января 2021, 13:10
class Singleton {
    private static $instances = [];
    public static function getInstance() {
        if(!isset(self::$instances[static::class])) {
            self::$instances[static::class] = new static;
        }
        return self::$instances[static::class];
    }
    protected function __construct() { }
    protected function __clone() { }
    protected function __wakeup() { }
}

Какой возвращаемый тип должен быть для getInstance

public static function getInstance() : self
// или
public static function getInstance() : static::class // и можно ли так делать?

Этот класс предполагается использовать для наследования другими классами, в которых нужен один объект (например logger).

Можно ли для этого сделать этот класс абстрактным, т.к. самостоятельно этот класс не имеет смысла ? Правильно понимаю, что для этого нужно просто добавитьabstract и ничего в классе менять не нужно?

Answer 1

Не получится у тебя указать тип возвращаемого значения, тут generics нужны, а в php их пока что нет :)

Logger logger = Singleton.getInstance<Logger>();
abstract class Singleton<T>{
  public static T getInstance(){
    // ...
  }
}

Вот так было бы в java к примеру. В PHP придется не указывать тип возвращаемого значения, либо реализовать какой нибудь костыль по типу

protected static function _getInstance(string $class)
{
   if(!isset(self::$instances[static::class])) {
            self::$instances[static::class] = new static;
        }
        return self::$instances[static::class];
}

и в дочерних реализовывать метод


public static function getInstance(): self
{
   return parent::_getInstance();
}
READ ALSO
Как реализовать передачу данных из js в action yii2?

Как реализовать передачу данных из js в action yii2?

Есть задача: реализовать некоторое подобие метрики\аналитики посетителей сайта

140
Загрузка файла с api-route, Laravel

Загрузка файла с api-route, Laravel

Всем приветЕсть такая схема сайта: интерфейс пользователя(он же фронт) -=> back-end этого фронта -=> api

112
Как используется hashCode в HashSet/HashMap?

Как используется hashCode в HashSet/HashMap?

В лекции JavaRush «Реализации интерфейса Set, Queue» говорится следующее:

114