31
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

グローバル変数を作らずにファイル間で値をやり取りする

Posted at

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();
31
30
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?