Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

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

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

これでおっけい!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?