前のトピック

< 設定ファイル

次のトピック

Phpinfo() の章 >

このページ

拡張のグローバル

PHP の拡張は、拡張内でグローバルを定義する方法を提供します。グローバルの読み込み/書き込み は(静的メンバーのような)他のどのようなグローバルな仕組みよりも速い筈です。ライブラリの挙動を変更する設定オプションをセットアップするために拡張のグローバルを使うことができます。

Zephirでは、拡張のグローバルは int/bool/double/char などのような単純なスカラー型に制限されています。string/arrays/objects/resources のようなコンプレックス型は許されません。

以下の構造を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>
}

組み込みの関数 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_get/globals_set オプティマイザによって生成されたCコードがコンパイル時に解決されなければならないため、拡張のグローバルは動的にアクセスすることができません:

let myOption = "someOption";

//コンパイル例外を投げるでしょう
let someOption = globals_get(myOption);
TOP
inserted by FC2 system