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で扱うときはtrue と false に統一すると覚えておくのが安全です。
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についてでした。
最後までお読みいただき、ありがとうございました。










