Глобальные и статические переменные в PHP

Я создаю базовую структуру в PHP. Мне нужно передать данные для текущей страницы в разные функции, позволить им изменять и сохранять ее, а затем передавать обратно на страницу, которая будет отображаться. Первоначально я планировал хранить данные в глобальной переменной, например $GLOBALS['data'], но я начинаю думать, что использование глобальной - плохая идея. Поэтому я думаю, что вместо этого я стану статическую переменную в системном классе и получаю доступ к ней с помощью system::$data. Итак, мой вопрос: что было бы лучше и почему?

Это:

$GLOBALS['data'] = array();
$GLOBALS['data']['page_title'] = 'Home';
echo $GLOBALS['data']['page_title'];

Или это:

class system
{
    public static $data = array()
}

function data($new_var)
{
    system::$data = array_merge(system::$data, $new_var);
}

data(array('page_title' => 'Home'));
echo system::$data['page_title'];

Ответ 1

На самом деле нет никакой разницы между глобальной переменной и переменной public static. Переменная класса - это имена, которые немного лучше, но это вряд ли имеет значение. Оба доступны в любом месте в любое время, и оба являются глобальными.

Как бы то ни было, я просто написал исчерпывающую статью на эту тему:
Как не убить вашу тестируемость с помощью статики

Ответ 2

Итак, мой вопрос: что было бы лучше и почему?

Вы уже чувствуете, что есть некоторая проблема, помещая это все в глобальные. Хотя вы разработали некоторые мысли, чтобы инкапсулировать вещи в класс.

Я думаю, что это хорошая отправная точка. Позвольте добавить еще немного специй к приготовлению пищи, чтобы сделать это более свободно в начале:

$data = new ArrayObject(array());
$data['page_title'] = 'Home';

Теперь вы создали объект, который можно передать вместе с вашими данными. Просто передайте $data в область, где это необходимо. Не требуется глобальная или глобальная статическая переменная.

Вы даже можете сделать этот тип более конкретным позже, перейдя из ArrayObject с вашим собственным типом.