• 全局扩展

    全局扩展

    PHP扩展提供了一种在扩展中定义全局变量的方法。 读/写全局变量应该比任何其他全局机制(如静态成员)更快。 您可以使用扩展全局变量来设置更改库行为的配置选项。

    在Zephir中,扩展全局变量仅限于简单的标量类型,如 int / bool / double / char 等。 此处不允许使用复杂类型,例如字符串/数组/对象/资源。

    您可以通过将以下结构添加到 config.json 来启用扩展全局变量:

    1. {
    2. "globals": {
    3. "allow_some_feature": {
    4. "type": "bool",
    5. "default": true,
    6. "module": true
    7. },
    8. "number_times": {
    9. "type": "int",
    10. "default": 10
    11. },
    12. "some_component.my_setting_1": {
    13. "type": "bool",
    14. "default": true
    15. },
    16. "some_component.my_setting_2": {
    17. "type": "int",
    18. "default": 100
    19. }
    20. }
    21. }

    每个全局具有以下结构:

    1. "<global-name>": {
    2. "type": "<some-valid-type>",
    3. "default": <some-compatible-default-value>
    4. }

    复合(命名空间)全局变量具有以下结构:

    1. "<namespace>.<global-name>": {
    2. "type": "<some-valid-type>",
    3. "default": <some-compatible-default-value>
    4. }

    可选的 module 键(如果存在)将全局的初始化过程放入模块范围的 GINIT 生命周期事件中,这意味着它只会在每个PHP进程中设置一次, 而不是为每个请求重新初始化,这是默认值:

    1. {
    2. "globals": {
    3. "allow_some_feature": {
    4. "type": "bool",
    5. "default": true,
    6. "module": true
    7. },
    8. "number_times": {
    9. "type": "int",
    10. "default": 10
    11. }
    12. }
    13. }

    在上面的例子中,allow_some_feature在启动时只设置一次;number_times是在每个请求开始时设置的。

    在任何方法中,您可以使用内置函数globals_get / globals_set读/写扩展全局变量:

    1. globals_set("allow_some_feature", true);
    2. let someFeature = globals_get("allow_some_feature");

    如果你想从PHP中改变这些全局变量,一个好的选择是包含一个针对这个的方法:

    1. namespace Test;
    2. class MyOptions
    3. {
    4. public static function setOptions(array options)
    5. {
    6. boolean someOption, anotherOption;
    7. if fetch someOption, options["some_option"] {
    8. globals_set("some_option", someOption);
    9. }
    10. if fetch anotherOption, options["another_option"] {
    11. globals_set("another_option", anotherOption);
    12. }
    13. }
    14. }

    不能动态访问扩展全局, 因为 globals_get/globals_set 优化器生成的 c 代码必须在编译时解析:

    1. let myOption = "someOption";
    2. // will throw a compiler exception
    3. let someOption = globals_get(myOption);