PHPのYAMLについて

採用はこちら

PHPで開発していると、config.yaml のようなファイルを見かけることがあります。

このときに出てくる YAML は、PHP専用の機能ではなく、設定やデータ構造を人間にわかりやすく書くためのフォーマットです。

PHPでは、このYAMLを読み込んで配列として扱ったり、逆に配列からYAMLを書き出したりできます。

特に設定ファイルまわりで使われることが多く、Symfony系の開発では触れる機会が多いです。

目次

YAMLとは何か

YAMLは、階層構造を持つデータを読みやすく表現するための記法です。

見た目はJSONに少し似ていますが、JSONよりも記号が少なく、設定ファイルとして読みやすいのが特徴です。

たとえば、次のようなデータがあるとします。

site_name: My Blog
debug: true
admins:
  - Alice
  - Bob

これはPHPで扱うと、だいたい次のような配列の形になります。

[
    'site_name' => 'My Blog',
    'debug' => true,
    'admins' => ['Alice', 'Bob'],
]

つまり、PHPでYAMLを扱うというのは、基本的には「YAMLをPHPの配列に変換して使う」という理解でまず問題ありません。

PHPでYAMLを使う主な場面

PHPでYAMLが使われるのは、主に次のような場面です。

  • アプリケーションの設定ファイル
  • 環境ごとの構成管理
  • フレームワークやライブラリの設定
  • 人が編集する前提のデータファイル
  • 開発ツールやデプロイ設定との連携

特に「コードの中に直接書きたくない設定」を外に出す用途と相性が良いです。

PHPでYAMLを扱う方法

PHPでYAMLを扱う方法は、大きく分けて2つあります。

PECL yaml拡張を使う方法

PHPの拡張機能として yaml を導入すると、専用の関数でYAMLを扱えるようになります。

たとえば、ファイルを読み込むならこうです。

<?php

$data = yaml_parse_file('config.yaml');
print_r($data);

この方法はシンプルですが、実行環境にyaml拡張が入っている必要があるため、サーバー構成に依存しやすいです。

Symfony Yamlコンポーネントを使う方法

もう1つは、Composerで導入できる Symfony Yamlコンポーネント を使う方法です。

PHPプロジェクトではこちらの方が扱いやすいことが多いです。

インストールは次のように行います。

composer require symfony/yaml

読み込みはこう書けます。

<?php

require 'vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;

$data = Yaml::parseFile('config.yaml');

print_r($data);

PHP配列をYAML文字列に変換することもできます。

<?php

require 'vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;

$data = [
    'site_name' => 'My Blog',
    'debug' => true,
    'admins' => ['Alice', 'Bob'],
];

$yaml = Yaml::dump($data, 2, 2);
echo $yaml;

YAMLの基本構文

PHPでYAMLを使うには、まずYAMLの基本的な書き方を知っておく必要があります。


キーと値

もっとも基本になるのは、キーと値の組み合わせです。

name: Shinichi
age: 30
active: true

これはPHPでは次のような形になります。

[
    'name' => 'Shinichi',
    'age' => 30,
    'active' => true,
]

ネストした構造

YAMLでは、インデントによって階層を表します。

user:
  name: Shinichi
  email: test@example.com

PHPではこうなります。

[
    'user' => [
        'name' => 'Shinichi',
        'email' => 'test@example.com',
    ]
]

配列

配列は - を使って表します。

colors:
  - red
  - blue
  - green

PHPではこうです。

[
    'colors' => ['red', 'blue', 'green']
]

配列の中にオブジェクトのような構造を書く

users:
  - name: Alice
    age: 25
  - name: Bob
    age: 28

PHPでは次のようになります。

[
    'users' => [
        ['name' => 'Alice', 'age' => 25],
        ['name' => 'Bob', 'age' => 28],
    ]
]

インデントがとても重要

YAMLで最も重要なのは、インデントが構造そのものになることです。

正しい例です。

database:
  host: localhost
  port: 3306

崩れた例です。

database:
 host: localhost
  port: 3306

このようにスペースの位置がズレると、パースエラーや意図しない構造の原因になります。

実務では次のルールで統一するのが安全です。

  • タブではなくスペースを使う
  • 2スペースで統一する
  • 同じ階層は同じ字下げ幅にする

文字列の扱い

YAMLでは、文字列はクォートなしでも書けることがあります。

title: Hello World
message: "This is a sample"
description: 'Single quoted text'

ただし、見た目が数値・真偽値・日付のように見える値は注意が必要です。

たとえば次のような値です。

zip_code: "01234"
member_code: "00123"
label_text: "false"
date_text: "2026-04-12"

こうした値は、クォートしないと意図しない型として解釈される可能性があります。

そのため、文字列として保持したいならクォートするのが安全です。

特に次のようなものはクォート推奨です。

  • 郵便番号
  • 商品コード
  • 会員番号
  • 文字列としての true / false
  • 日付っぽい値
  • 先頭ゼロを含む番号

ブール値は true / false を使う

YAMLでは真偽値の書き方に迷うことがありますが、PHPで扱うときはtruefalse に統一すると覚えておくのが安全です。

debug: true
cache_enabled: false

これなら読み手にもわかりやすく、曖昧さも減らせます。

複数行文字列

YAMLでは長文も書けます。

改行を保ちたい場合

text: |
  1行目
  2行目
  3行目

これは改行を含んだ文字列として扱われます。

改行を折りたたみたい場合

text: >
  1行目
  2行目
  3行目

こちらは改行が空白にまとめられるような形になります。

実務では、

  • 改行込みで保持したい説明文は |
  • 長文を1つの文章として扱いたいなら >

という使い分けで十分です。

PHPでYAMLを読み込む例

たとえば、次のような設定ファイルがあるとします。

config.yaml

app:
  name: Sample App
  env: local
  debug: true

db:
  host: localhost
  port: 3306
  database: sample_db
  user: root
  password: secret

これをSymfony Yamlで読み込むとこうなります。

<?php

require 'vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;

$config = Yaml::parseFile(__DIR__ . '/config.yaml');

echo $config['app']['name'] . PHP_EOL;
echo $config['db']['host'] . PHP_EOL;

PHPでYAMLを書き出す例

<?php

require 'vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;

$config = [
    'app' => [
        'name' => 'Sample App',
        'env' => 'production',
        'debug' => false,
    ],
    'db' => [
        'host' => '127.0.0.1',
        'port' => 3306,
        'database' => 'prod_db',
    ],
];

$yaml = Yaml::dump($config, 4, 2);
file_put_contents('output.yaml', $yaml);

このように、PHP配列から設定ファイルを自動生成することもできます。

エラーハンドリングは入れた方がよい

YAMLは見た目が読みやすい反面、インデントミスや構文ミスで壊れやすいです。

そのため、読み込み時にはエラー処理を入れておくと安心です。

<?php

require 'vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Yaml\Exception\ParseException;

try {
    $config = Yaml::parseFile(__DIR__ . '/config.yaml');
    print_r($config);
} catch (ParseException $e) {
    echo 'YAML parse error: ' . $e->getMessage();
}

また、読み込んだ値を使うときは、キーが必ず存在する前提にしない方が安全です。

$dbHost = $config['db']['host'] ?? 'localhost';

外部入力をそのままYAMLとして扱わない方がよい

YAMLは単なる見た目の整ったテキストではなく、型や構造を持ったデータ記述形式です。

そのため、ユーザー入力や外部から来た不明な文字列を、そのままYAMLとしてパースするのは慎重に考えるべきです。

実務では、YAMLは主に

  • 自分で管理している設定ファイル
  • 信頼できる環境内の定義ファイル

に使う方が安全です。

機密情報はYAMLに直接書かない方がよい

設定ファイルに全部書きたくなりますが、パスワードやAPIキーまでYAMLに入れると管理が危険になりやすいです。

よくある実務上の分け方は次の通りです。

  • 共通設定はYAML
  • 機密情報は環境変数
  • PHP側で両方を組み合わせる

たとえば次のような形です。

app.yaml

app:
  name: My Service
  debug: false

mail:
  from: noreply@example.com

PHP側

<?php

require 'vendor/autoload.php';

use Symfony\Component\Yaml\Yaml;

$config = Yaml::parseFile(__DIR__ . '/app.yaml');

$dbHost = $_ENV['DB_HOST'] ?? '127.0.0.1';
$dbPassword = $_ENV['DB_PASSWORD'] ?? '';

アンカーとエイリアス

YAMLには、同じ設定を再利用するための仕組みがあります。

default: &default_settings
  adapter: mysql
  host: localhost

development:
  <<: *default_settings
  database: dev_db

test:
  <<: *default_settings
  database: test_db

これは共通設定をまとめるときに便利です。

ただし、こうした高度な記法は便利な反面、YAMLに慣れていない人には読みにくくなりやすいです。

そのため、チームで扱う設定では、再利用性より読みやすさを優先した方がよい場面もあります。

複数ドキュメント

YAMLは、1つのファイルに複数のドキュメントを書くこともできます。

---
name: Doc1
---
name: Doc2

ただし、一般的なPHPアプリの設定ファイルとしては、ここまで使うことはあまり多くありません。

通常は1ファイル1設定の方がわかりやすいです。

YAMLとJSONの違い

PHPで使うときは、次のように考えるとわかりやすいです。

YAMLが向いている場面

  • 設定ファイル
  • 人が手で編集するデータ
  • コメントを書きたい
  • 階層構造を見やすくしたい

JSONが向いている場面

  • API通信
  • JavaScriptとのやり取り
  • 厳密なデータ交換
  • 機械処理を優先したい場合

つまり、設定はYAML、通信はJSONという使い分けはかなり自然です。

どちらを選ぶべきか

PHPでYAMLを使うとき、最初の判断はこう考えるとわかりやすいです。

Symfony Yamlが向いている場合

  • Composerを使っている
  • 環境依存を減らしたい
  • フレームワーク外でも柔軟に使いたい

PECL yaml拡張が向いている場合

  • サーバーに拡張を入れられる
  • 関数ベースで直接扱いたい
  • 実行環境がきちんと揃っている

実務では、移植性や導入しやすさを考えると、Symfony Yamlの方が扱いやすいケースが多いです。

初心者がつまずきやすいポイント

PHPでYAMLを触り始めたときに、特につまずきやすいのは次の点です。

タブでインデントしてしまう

YAMLではスペースを使う方が安全です。

階層の字下げが揃っていない

インデントのズレはそのまま構造のズレになります。

数字っぽい文字列をクォートしていない

郵便番号や商品コードは文字列として明示した方が安全です。

PHP側で存在しないキーをそのまま参照してしまう

Undefined array key の原因になります。

機密情報まで設定ファイルにまとめてしまう

公開リポジトリや共有環境では特に危険です。

まとめ

PHPのYAMLをひとことで言うと、「人が読みやすい設定やデータを、PHPで配列として扱うための仕組み」です。

覚えておきたい大事なポイントは次の通りです。

  • YAMLはPHP専用ではない
  • PHPでは主に PECL yaml拡張か Symfony Yaml を使う
  • YAMLはインデントが重要
  • ブール値は true / false を使う
  • 数字に見える文字列はクォートする
  • 設定ファイル用途と相性が良い
  • 機密情報は環境変数と分けて管理する
  • YAMLを読むと、PHPでは基本的に配列として扱う

以上、PHPのYAMLについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次