$_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";
とかできたかも・・・。まぁ、旧値を返すのもそれはそれで便利なのでいっか。