requireかincludeを使う。最近?よく見かけるような気がする書き方。
config.php
<?php
/**
* あちこちで共有される設定値
*/
return [
'hoge' => 'fuga',
];
receiver.php
<?php
//値を使いたい場合はrequire式を埋め込む
var_dump(require 'config.php');
グローバル変数とは違って、こちらは受け渡されるものが値なので書き換えの心配もなく、安心して使いやすい。
PHPの場合、式では書けず文にせざるを得ない構文が多いので、上記のままだとうまく書けないケースがあるかもしれない。その場合はJavaScript風に即時関数を組み合わせるとよい。
config.php
<?php
/**
* あちこちで共有される設定値
*/
return call_user_func(function(){
//この中で変数初期化を色々やってもグローバル変数は汚れない
$date = new DateTime;
$date->modify('+1 day');
return [ 'moge' => $date ];
});
注意点として、このパターンではrequire_once、include_onceが使えないことがあげられる。
_once系は初回読み込みだけは値を返すが、2回目以降はtrueを返すようになってしまう。
期待通りに動かないパターン
<?php
var_dump(require_once 'config.php'); //['hoge'=>'fuga']
var_dump(require_once 'config.php'); //true
requireを使うようにすればいいのだけれど、毎回変数を構築するので、巨大なオブジェクトを作るようなコードだとコストが気になるところ。
初期化を一回に限定する方法としては、あまりカッコいいものが思いつかない。
適当な一時関数用の名前空間を作って、static変数を活用する感じだろうか。
config.php
<?php
namespace My\Temp;
if (!function_exists('My\Temp\getConfig')) {
function getConfig() {
static $config;
if (!$config) {
$config = ['hoge' => 'fuga'];
}
return $config;
}
}
return getConfig();