2

現在、PHP でライブラリを開発しています。このライブラリは、独自の名前空間を使用します。グローバル (ライブラリの名前空間のスコープ内) 設定を保存するには、次のような静的クラスを使用します。

class Settings {
    public static $verbose = true;
}

詳細な出力を簡単かつ適応可能にするために、次のような静的メソッドを使用します。

class Log {
    public static function v($msg) {
        if ( ! Settings::$verbose) { return; }
        echo $msg . "<br>\n";
    }
}

このようにして、詳細な出力をコードに簡単に追加できます。

Log::v('Answering questions...');
echo '42';

ただし、このアプローチでは、冗長出力が非アクティブ化されるとすぐに返される不要なメソッド呼び出しが多数作成されます。

ここで、次のようにアプローチを変更することを考えました。

class Log {

    public static $v = false;

    public static function init() {
        self::$v = Settings::$verbose;
    }

    public static function v($msg) {
        echo $msg . "<br>\n";
    }

}

短いという理由だけでSettings::$verbosetoの値をコピーします。Log::$v今-一度呼び出した後Log::init()-詳細な出力行は次のようになります。

Log::$v && Log::v('All questions answered.');

しかし、この行は単純に入力するほどきちんとした/短くはありませんLog::v('')Log::$v && Log::v('')何が起こっているかについての情報を追加したいときはいつでも入力しなければならないという考えは好きではありません。

私の質問は次のとおりです。最小限のフットプリントで冗長出力を追加する別の方法はありますか? 私が認識していない PHP の組み込み関数はありますか?

他のコンポーネントとの競合を避けるために、ライブラリの名前空間内に保持したいので、 のようなグローバル定数を使用したくありませんdefine('V', true)

更新:定数を名前空間にできることを認識したので、2番目のアプローチを次のように変更できます。

define(__NAMESPACE__ . '\V', true);
V && Log::v('...');

しかし、私の疑問は残ります...

4

0 に答える 0