019 Глобальные параметры рассширения
Расширения PHP предоставляют способ определения глобальных переменных внутри расширения. Чтение/запись глобальных данных должны быть быстрее, чем любые другие глобальные механизмы (например, статические члены). Глобальные значения расширений можно использовать для настройки параметров конфигурации, которые изменяют поведение вашей библиотеки.
В Zephir расширения globals ограничены простыми скалярными типами типа int/bool/double/char и т.д. Здесь не допускаются сложные типы, такие как строки/массивы/объекты/ресурсы.
Вы можете включить глобальные расширения, добавив следующую структуру в config.json:
{
    //...
    "globals": {
        "allow_some_feature": {
            "type": "bool",
            "default": true
        },
        "number_times": {
            "type": "int",
            "default": 10
        },
        "some_component.my_setting_1": {
            "type": "bool",
            "default": true
        },
        "some_component.my_setting_2": {
            "type": "int",
            "default": 100
        }
    }
}
Каждая глобальная секция имеет следующую структуру:
"<global-name>": {
    "type": "<some-valid-type>",
    "default": <some-compatible-default-value>
}
Составные глобальные переменные имеют следующую структуру:
"<namespace>.<global-name>": {
    "type": "<some-valid-type>",
    "default": <some-compatible-default-value>
}
Необязательный ключ module , если он присутствует, помещает процесс инициализации глобального процесса в общий жизненный цикл GINIT, что означает, что он будет настроен только один раз на PHP-процесс, а не будет повторно инициализирован для каждого запроса, что является значением по умолчанию:
{
    //...
    "globals": {
        "allow_some_feature": {  // set up only once, at startup
            "type": "bool",
            "default": true,
            "module": true
        },
        "number_times": {        // set up at the start of each request
            "type": "int",
            "default": 10
        }
    }
}
Внутри любого метода вы можете читать/писать глобальные расширения с помощью встроенных функций globals_get/globals_set:
globals_set("allow_some_feature", true);
let someFeature = globals_get("allow_some_feature");
Если вы хотите изменить эти глобальные переменные из PHP, хорошим вариантом является включение метода, направленного на это:
namespace Test;
class MyOptions
{
    public static function setOptions(array options)
    {
        boolean someOption, anotherOption;
        if fetch someOption, options["some_option"] {
            globals_set("some_option", someOption);
        }
        if fetch anotherOption, options["another_option"] {
            globals_set("another_option", anotherOption);
        }
    }
}
Расширения globals не могут быть динамически доступны, так как C-код, сгенерированный оптимизаторами globals_get / globals_set, должен быть разрешен во время компиляции:
let myOption = "someOption"; // Будет генерировать исключение компилятора let someOption = globals_get(myOption);
