[PHP] 設定ファイルフォーマット色々

2018年10月29日月曜日

JSON NEON PHP YAML

PHPのフレームワークやライブラリを使っていると、色々なフォーマットの設定ファイルが登場する。
各種のファイルを自分で読む場合も簡単にできてしまう。

PHP

設定ファイルもPHPファイルそのまんま。
CodeIgniterなんかで使われていて、結構スタンダードなパターンとも言える。

config.php
<?php
$config['language'] = 'japanese';

これを単純に require することによって $config変数を取り込む。
require_once 'config.php';
var_dump($config);
// array(1) {
//   ["language"]=>
//   string(8) "japanese"
// }

ただし、これだと読み込む側で変数名を制御できないので、読み込む側で変数名を決めたい場合は、設定ファイルから無名のオブジェクトをreturnするようにする。
読み込む側はrequireの戻りを変数に格納する。

config.php
<?php
return [ 'language' => 'japanese' ];

$cfg = require_once 'config.php';
var_dump($cfg);
// array(1) {
//   ["language"]=>
//   string(8) "japanese"
// }

JSON

JSONはComposerで設定ファイルとして使われている。
元々、クライアントサイドとのやり取りでJSON形式はよく使われるため、PHPの標準で関数が用意されている。

http://php.net/manual/ja/ref.json.php

file_get_contentsを使って、ファイル全体を読み込んだ文字列をjson_decodeに渡すことによってオブジェクトを生成してくれる。

config.json
{ "language" : "japanese" }

$json_config = json_decode(file_get_contents('config.json'));
var_dump($json_config);
// object(stdClass)#1 (1) {
//   ["language"]=>
//   string(8) "japanese"
// }

YAML

YAMLのパーサーはPHPの拡張モジュールがあるけど、追加でインストールをする必要があり、ちょっと面倒。

http://php.net/manual/ja/book.yaml.php

なので、SymfonyのYamlコンポーネントを使った方が手軽にできる。

https://symfony.com/doc/current/components/yaml.html

composerを使ったインストールは以下の通り。
$ composer require symfony/yaml

JSONの時とほとんど同じで、ファイル読み込んで、文字列をパーサーに渡す。

config.yml
config:
    language: japanese

require_once 'vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;

$yaml_config = Yaml::parse(file_get_contents('config.yml'));
var_dump($yaml_config);
// array(1) {
//   ["config"]=>
//   array(1) {
//     ["language"]=>
//     string(8) "japanese"
//   }
// }

NEON

NEONはPHPStanで使われている。

https://ne-on.org
https://github.com/nette/neon

パッと見はyamlに似ているけど、Entityが使えるのが特徴らしい。
こんな感じの。

entity: Column(type=int, nulls=yes)

これもcomposerでインストール。
$ composer require nette/neon

config.neon
config:
    language: japanese

require_once 'vendor/autoload.php';

use Nette\Neon\Neon;

$neon_config = Neon::decode(file_get_contents('config.neon'));
var_dump($neon_config);
// array(1) {
//   ["config"]=>
//   array(1) {
//     ["language"]=>
//     string(8) "japanese"
//   }
// }

NEONはまだ新しい記法のようだけど、応用もありそうなので、もうちょっと突っ込んで調べてみたい。