一度だけ計算する必要がある値があります。const
ただし、最初に計算するためにいくつかの関数を実行する必要があるため、宣言には使用できません。ある程度保護された方法で保存し、(ネームスペース化された) グローバル関数でアクセスできるようにしたいと考えています。これを行うのに適したパターンは何ですか? ここに私が持っているものがあります:
オプション1-うまく機能しますが、定数に対してのみ機能するため、これは使用できません:
<?php
namespace my;
const PREFIX = 'example';
/**
* my\get_prefix()
*/
function get_prefix () {
return PREFIX;
}
オプション 2 - 名前空間付き関数は、構成済みの名前空間付き public static クラスの値にアクセスします。
<?php
namespace my;
class Hash {
public static $prefix;
public static function configure () {
self::$prefix = call_user_func(function () {
// calculate and return a string
});
}
}
Hash::configure();
/**
* my\get_prefix()
*/
function get_prefix () {
return Hash::$prefix;
}
オプション 3 - #2 に似ていますが、ここでは構成が初めてget_prefix
呼び出されて実行され、毎回文字列であることがチェックされます。
<?php
namespace my;
class Hash {
public static $prefix;
}
/**
* my\get_prefix()
*/
function get_prefix () {
if ( is_string(Hash::$prefix) )
return Hash::$prefix;
Hash::$prefix = call_user_func(function () {
// calculate and return a string
});
return Hash::$prefix;
}
オプション 4 - 静的メソッド / プライベート var を使用して完全に保護されていますが、次の方法で呼び出された場合は追加の関数呼び出しが追加されますmy\get_prefix()
。
<?php
namespace my;
class Hash {
private static $prefix;
public static function configure () {
if ( isset(self::$prefix) ) return;
self::$prefix = call_user_func(function () {
// calculate and return a string
});
}
public static function get_prefix () {
return self::$prefix;
}
}
Hash::configure();
/**
* my\get_prefix()
*/
function get_prefix () {
return Hash::get_prefix();
}