Как правильно сделать сохранение «глобальной переменной»?
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();
Может сначала задачу свою озвучишь?

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

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

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