@yellow_pus

Как правильно сделать сохранение «глобальной переменной»?

Насколько я знаю, использование глобальных переменных - плохая практика. На замену приходит синглтон. Я хочу сделать следующим образом: Есть функция в классе, которая бы сохраняла определенные данные в переменной, я написал этот класс так
class save
{
    public $data;
    public static $instance;

    public function __construct()
    {
    }

    public static function getInstance()
    {
        if (empty(self::$instance)) {
            self::$instance = new save();
        }
        return self::$instance;
    }

    public function setData(string $value)
    {
        $this->data = $value;
    }
}
.
После, к этой функцией обращаются из первого(любого) класса, сохраняя что либо, я написал так:
class A
{
    public static function tryW()
    {
        $t = save::getInstance();
        $t->setData('part');
    }
}

Далее у меня ступор. Хочу в классе B, внутри метода обратиться к этому сохраненному значению в переменной. Я понимаю, что делаю это неправильно, пожалуйста поправьте меня:
class B
{
    public static function tryGet()
    {
        $get = save::getInstance();
        var_dump($get);
    }
}
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
Singleton - тоже плохая практика

class Single
{
    public array $data = [];
    public static $instance;

    PRIVATE function __construct()
    {
    }

    public static function getInstance()
    {
        if (empty(self::$instance)) {
            self::$instance = new Single();
        }
        return self::$instance;
    }

    public function __get(string $key)
    {
        return $this->data[$key]??null;
    }

    public function __set(string $key, $value)
    {
        $this->data[$key] = $value;
    }
}

class A
{
    public static function tryW()
    {
        Single::getInstance()->some = 1;
    }
}

class B
{
    public static function tryR()
    {
        var_dump(Single::getInstance()->some);
    }
}

$a = new A();
$a->tryW();

$b = new B();
$b->tryR();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rPman
Может сначала задачу свою озвучишь?

Глобальная переменная закрывает возможность переиспользования кода на большее количество экземпляров объекта, т.е. завязывая свой код на глобальные переменные (или если ты спрячешь свою переменную в глобальной функции или статичной переменной) ты ограничиваешь себя в своих возможностях.

Так же тестировать такой код сложнее, ведь если поведение класса определяется только его внутренним состоянием, это состояние проще симулировать.

Но если логика программы даже не подразумевает подобного, то почему нет? Отличный пример - объект базы данных, если программа даже в самых жутких кошмарах не предпологает работу с несколькими базами одновременно, зачем описывать объект Database и таскать ссылку на него в каждом объекте проекта, когда глобальный его экземпляр более чем достаточен (кстати в таких случаях может хватит статики, синтаксически это удобнее).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект
30 апр. 2024, в 23:39
5000 руб./за проект