LoginSignup
5
1

More than 3 years have passed since last update.

PHPでconfigファイルをオートロードで呼び出す方法

Last updated at Posted at 2020-09-22

Laravelをやっているとconfigから値を呼ぶことがあります。
同様に素のPHPでも使いたいなと思ったのでやり方を書いておきます

Config.php
<?php
class Config {
    protected static $directory;
    public static function setConfigDirectory($directory) {
        self::$directory = $directory;
    }

    public static function getConfigDirectory() {
        return rtrim(self::$directory, '/\\');
    }

    public static function get($s) {
        $values = preg_split('/\./', $s, -1, PREG_SPLIT_NO_EMPTY);
        $key = array_pop($values);
        $file = 'common.php';
        $path = (!empty($values)) ? implode(DIRECTORY_SEPARATOR, $values) .
            DIRECTORY_SEPARATOR : '';
        $base_dir = self::getConfigDirectory() . DIRECTORY_SEPARATOR;
        $config = include($base_dir . $path . $file);
        return $config[$key];
    }
}

これの他にconfig/common.phpを作ってください

common.php
<?php
return [
    'STRIPEKEY' => 'abc',
    'ZOOMKEY' => '123',
];

読み込みたいファイルで

example.php
<?php
require_once 'Config.php';
Config::setConfigDirectory(__DIR__ . '/config');

これを追記してください

蛇足ですが、require, includeの違いは

ファイルが読み込めなかった場合
require文の場合はFatalエラーで処理が終了するが
include文の場合はWarnigエラーで処理が継続されることです

require_once, include_onceの違いは

同じファイルを読み込んだ場合に
_once文は一度しかファイルを読み込まないが
require, include文は何度でも読み込むことです

つまりほとんどの場合はrequire_onceでいいですね

gitにpushするときは

.gitignore
config/
Config.php #任意

を追記すればいいでしょう

example.php
<?php
require_once 'Config.php';
Config::setConfigDirectory(__DIR__ . '/config');
echo Config::get('STRIPEKEY'); //abc
echo Config::get('ZOOMKEY'); //123

読み込むのがめんどくさいときはオートロードしましょう
オートロードはクラスを利用する際に自動的にそのクラスが定義されているファイルを読み込む機能です
処理上のオーバーヘッドを防ぐために使うといいですね!
spl_autoload_register()関数を使う
オートロードの処理をコールバック関数として任意のタイミングで登録できて
__autoload()関数と違って複数のオートロード関数を登録しておくこともできる

lib/autoload.php
<?php
spl_autoload_register(
    function($class_name)
    {
        $filepath = __DIR__ . '/' . $class_name . '.php';
        if (is_readable($filepath)) require $filepath;
        if ($class_name == 'Config') Config::setConfigDirectory(__DIR__ . '/config');
    }
);
#複数作ると必要なクラスの定義が見つかるまで登録した順にコールバック関数が実行される

それを読み込もう

example.php
<?php
require 'lib/autoload.php';
echo Config::get('ZOOMKEY'); //123

これでおっけい!

5
1
0

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
5
1