Monthly Archives: 11月 2012

PHPで設定値。defineだのconstだの

PHPで設定値。
これって実は人によってやり方が様々で、それぞれの実装方法によって使い勝手も違うらしい。

単純に、組み込みで用意されているものを使うのであれば

define("CONF_A", "設定値");
echo CONF_A;

的な。

他にも

final class Config {
  const DATA_A  = "設定値";
}
echo Config::DATA_A;

とか。

クラス&const方式はまあ悪くないのかな?って思ってた。
設定の種類ごとにクラス名を変えるって事も可能だしね。

でもコイツって、

class Config {
	const B = "aa"."asd";
}

ができないんだよね。
式は基本何も使えない。

文字列結合くらい許せや。っていう・・・

実際問題、URLなんかを定義する時って
1) トップのURLを定義
2) 1で定義した設定値に文字列結合で配下のURLを設定
っていうのが当たり前だと思うんだ。

ドメイン変更とかURL変更に伴って大量の設定値の変更なんてやりたくありませんからね割とマジで。

constが悪いのかと思い

class Config {
	public static $B = "aa"."asd";
}

みたいしてみてもやっぱりダメ。

って事でclassで設定値を定義するのは諦めました。
やっぱdefineさん最高だよね。

で、defineについては基本的に式を受け付けてくれる

define("AAA", dirname(__FILE__)."/aaa.php");
define("BBB", "aaa"."bbb");

なんでもOK。

でもdefineって配列使えないんだよね。

define("CONF_A", array(1, 2, 3));

これはエラーがでます。

実際システム作っている時って設定値に配列使いたいときってよくあるんだよね。
で、みんなどうしているかっていうと、よく見かける設定値はこんな感じです。

define("CONF_A", "123456");
$CONF_B = array(1, 2, 3);

あれ?だったら全部いっその事変数にした方がいいんじゃないか?

$CONF_A = "123456";
$CONF_B = array(1, 2, 3);

これでglobalで呼び出す事で全部解決。
式も配列も全部使えて効率的だしスッキリした設定ファイルになるぞ。

あれ・・・・?ところで定数って何だっけ・・・

で、個人的には変数でも良いと思っています。
書き換えができてしまう。とは言ってもその辺はコーディングルールでカバーする形にできれば。
要はルール決めさえしっかりとあれば良くって、
必ず大文字で定義しましょう。でも効果も可読性もあると思う。

あとは好みの問題もあると思うけど、無理やりdefineでやる方法も何となくあみだした。

define("CONF", serialize(array(1, 2, 3)));
var_dump(unserialize(CONF));

serializeで無理やり文字列に変換して、
取り出す時はunserializeで配列に復元。

なんか一見微妙っぽいけど、ある意味やりたい事は全部できているような気がする。

・「定数」として定義したい
・配列を使いたい
・式を使いたい
・globalとか使わずに使いたい

うん、全部満たせているわ。なんか微妙っぽい感じもあるけど。

そして若干気に入りました。