Расширения 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);

Содержание.

Предыдушая  Следующая