ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

$_YBと_YB()について。

昨晩、ラストワンとして色々直しておいてあれなんだけど。今朝起きがけに思いついたこと。
今まで、configで設定可能な値は

$_YB['hoge.bohe.moge'] = "abc";

みたいな感じで、グローバルな$_YB連想配列に持たせようと思っていた。

なんだけど、昨日実は某NPO団体のPHPをちょっと頼まれて修正してて、ファイルのrequireがあちこちネストしてて、それぞれで同じグローバル変数に手を入れていると、どうも、スコープの関連か上手く反映しない。


情けないことだが「おまじない」として、

global $_HOGEHOGE;
$_HOGEHOGE['foo.bar'] = ...;

としても上手く行かない。

というわけで、require()がネストする環境で、それぞれのファイルで同じグローバル変数を操作するのは、色々と嵌りどころが多そうなのです。ですので、いっそ、内部にstatic変数を持った一種の簡易Singletonを作った方が速いのではないか・・・。と。

<?php
function _YB() {
static $_vars = array();
$numargs = func_num_args();
if ($numargs == 1) {
    $k = func_get_arg(0);
    return @$_vars[$k];
} else if ($numargs > 1) {
    $k = func_get_arg(0);
    $v = func_get_arg(1);
    $old = @$_vars[$k];
    $_vars[$k] = $v;
    return $old;
} else {
    return null;
}

// 使い方
$value = _YB('key1.key2.key3');
$old = _YB('key1.key2.key3', $new_value);
?>


実際はmemoriesで実験していた、"."区切りの多段連想配列のparse/mergeを導入すると思うのでもっと込み入ると思うけど、I/Fとしてはおおよそこんな感じかな?左辺値代入が使えれば、

_YB("key.a.b.c") = "new_value";

とかできたかも・・・。まぁ、旧値を返すのもそれはそれで便利なのでいっか。