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);