Global State PHP
Glossary overview

Global State PHP

Global State — это данные (переменные, объекты, массивы), которые доступны из любой части программы, независимо от области видимости (scope). То есть это переменные, которые существуют “везде”.

В PHP глобальное состояние чаще всего проявляется в виде:

  • Глобальных переменных
  • Суперглобальных массивов ($_GET, $_POST, $_SESSION, $_SERVER, и т.д.)
  • Singleton-объектов
  • Статических свойств классов
  • Констант, объявленных через define() или const вне класса

global

Пример 1:

$counter = 0;

function incrementCounter() {
    global $counter;
    $counter++;
}

incrementCounter();
echo $counter; // 1

Пример 2:

Мне надо было глобально установить результаты фильтрации постов.

На Ricconected у нас есть функция, которая фильтрует результаты поиска.

В конце функции, перед возвратом результатов, установим их в глобальную переменную.

 $sorted_results = sort_posts_by_cpt( $final_posts );

        global $wp_query;
        $wp_query->posts = $sorted_results;
        $wp_query->post_count = count( $sorted_results );

        global $custom_search_filtered_posts;
        $custom_search_filtered_posts = $sorted_results;

        return $sorted_results;

И теперь можем обращаться к global $custom_search_filtered_posts в другом месте.

Вот, например, мы получаем ее в Functions.php и передаем в wp_localize_script.

    global $custom_search_filtered_posts;

    $structured = [];
    if (!empty($custom_search_filtered_posts)) {
        $structured = array_map(function($post) {
            return [
                'id'      => $post->ID,
                'title'   => get_the_title($post),
                'link'    => get_permalink($post),
                'type'    => get_post_type($post),
                'excerpt' => get_the_excerpt($post),
                'image'   => get_the_post_thumbnail_url($post, 'medium'),
                'terms'   => array_map(function($term) {
                    return $term->term_id;
                }, wp_get_post_terms($post->ID, get_object_taxonomies($post)))
            ];
        }, $custom_search_filtered_posts);
    }

    wp_enqueue_script(
        'filter-customize',
        get_stylesheet_directory_uri() . '/src/js/filter-customize.js',
        ['jquery'],
        filemtime(get_stylesheet_directory() . '/src/js/filter-customize.js'),
        true
    );

    wp_localize_script('filter-customize', 'WP_CPT_DATA', [
        'items' => $structured
    ]);

Суперглобальные массивы

echo $_GET['page']; // доступно в любом месте скрипта

Массив $_GET — это суперглобальный массив, доступный повсюду. Его состояние зависит от запроса пользователя.

Статическое свойство класса (тоже глобальное состояние)

class Config {
    public static $debug = true;
}

if (Config::$debug) {
    echo "Debug mode on";
}

Статические свойства класса доступны в любом месте кода, если ты подключишь класс. Это тоже форма глобального состояния.

⚠️ Почему Global State может быть опасен

  1. Сложность отладки: изменение глобального состояния в одной части программы может неожиданно повлиять на другую часть.
  2. Трудность тестирования: юнит-тесты сложно изолировать, когда код зависит от внешнего состояния.
  3. Проблемы в больших проектах: глобальные переменные создают сильную связанность между модулями, усложняя поддержку.

✅ Когда использовать Global State

Иногда глобальное состояние — это неизбежно и удобно:

  • Работа с $_SESSION, $_COOKIE
  • Хранение конфигурации в одном месте (Config класс или env переменные)
  • Глобальные константы вроде SITE_NAME

📚 Как уменьшить вред от Global State

  • Используй DI (Dependency Injection): передавай зависимости явно.
  • Прячь глобальное состояние за обёртки (например, Config::get() вместо прямого доступа к $_ENV).
  • Используй сервисы и контейнеры зависимостей (например, в Laravel или Symfony).