これは、 PHP5.2.xと互換性のある一般的なメモ化ソリューションです。
call_memoized関数:
- 関数名と引数に基づいて一意のキャッシュキーを生成します。
- キャッシュが空の場合、関数を呼び出し、結果でキャッシュを更新します。
- キャッシュされた値を返します。
call_memoizedを直接使用する代わりに、提供されたmemoize関数を使用します。この関数は、パラメーターの同じ組み合わせからの結果を自動的にキャッシュする、指定された関数の新しいバージョンを返します。
以下の例を参照してください。
楽しみ!
global $MEMO_CACHE;
$MEMO_CACHE = array();
/** Returns the result of the function with the given arguments.
* Invokes the function only once, thereafter returns the result
* cached by a key based on the function name and arguments. */
function call_memoized($fun, $args=array()) {
global $MEMO_CACHE;
// generate a cache key based on the function name and arguments
$uid = md5(
implode("|", array_merge((array)$fun, array_map(
"serialize",
$args)
))
);
// if there result hasn't been cached, call the function
// and update the cache with the result.
if(!array_key_exists($uid, $MEMO_CACHE)) {
$MEMO_CACHE[$uid] = call_user_func_array($fun, $args);
}
return $MEMO_CACHE[$uid];
}
/** Returns a memoized version of the given function that will cache
* its results for each unique set of inputs. */
function memoize($fun) {
return create_function(
'',
"\$args = func_get_args(); return call_memoized('$fun', \$args);"
);
}
例:
/** Returns a random number with the given greeting. */
function random($greeting) {
return "$greeting! " . rand();
};
print("Five random numbers:</br />");
for($i=0; $i<5; $i++) {
print(random("Spin the wheel") . "<br />");
}
print "<br />";
print("After memoizing the random function, it's not so random:<br />");
$not_so_random = memoize("random");
for($i=0; $i<5; $i++) {
print($not_so_random("Spin the wheel") . "<br />");
}
print "<br />";
print("The same memoized function is invoked with a different argument, and
thus creates a different cache key:<br />");
for($i=0; $i<5; $i++) {
print($not_so_random("Twirl the tire") . "<br />");
}
/* OUTPUT
Five random numbers:
Spin the wheel! 26488
Spin the wheel! 20049
Spin the wheel! 14006
Spin the wheel! 28599
Spin the wheel! 804
After memoizing the random function, it's not so random:
Spin the wheel! 32397
Spin the wheel! 32397
Spin the wheel! 32397
Spin the wheel! 32397
Spin the wheel! 32397
The same memoized function is invoked with a different argument, and
thus creates a different cache key:
Twirl the tire! 2114
Twirl the tire! 2114
Twirl the tire! 2114
Twirl the tire! 2114
Twirl the tire! 2114
*/