頼むから定数にしてくれ

はじめに

実務にて、あるサイトで 47 都道府県の選択メニューが色んなページに直書きされているのを発見してしまった。これでは県名や順番が変わった時に、全てのメニューを一々修正しないといけなくなる。そこで、都道府県を PHP で定数化して、保守しやすいように解決した情報になります。

ソースコード

<?php
const PREFECTURES = [
  '愛知県',
  '青森県',
  '秋田県',
  '石川県',
  '茨城県',
  '岩手県',
  '愛媛県',
  '大分県',
  '大阪府',
  '岡山県',
  '沖縄県',
  '香川県',
  '鹿児島県',
  '神奈川県',
  '岐阜県',
  '京都府',
  '熊本県',
  '群馬県',
  '高知県',
  '埼玉県',
  '佐賀県',
  '滋賀県',
  '静岡県',
  '島根県',
  '千葉県',
  '東京都',
  '徳島県',
  '栃木県',
  '鳥取県',
  '富山県',
  '長崎県',
  '長野県',
  '奈良県',
  '新潟県',
  '兵庫県',
  '広島県',
  '福井県',
  '福岡県',
  '福島県',
  '北海道',
  '三重県',
  '宮城県',
  '宮崎県',
  '山形県',
  '山口県',
  '山梨県',
  '和歌山県'
];
<?php require_once __DIR__ . '/constants.php'; ?>

<select name="prefectures">
  <?php foreach (PREFECTURES as $num => $prefecture): ?>
    <option value="<?= $num ?>"><?= $prefecture ?></option>
  <?php endforeach; ?>
</select>

検証環境

解説

このような HTML コードを見たことがあるだろうか。

<select name="prefectures">
  <option value="1">愛知県</option>
  <option value="2">青森県</option>
  <option value="3">秋田県</option>
  <option value="4">石川県</option>
  <option value="5">茨城県</option>
  <option value="6">岩手県</option>
  <option value="7">愛媛県</option>
  <option value="8">大分県</option>
  <option value="9">大阪府</option>
  <option value="10">岡山県</option>
  <option value="11">沖縄県</option>
  <option value="12">香川県</option>
  <option value="13">鹿児島県</option>
  <option value="14">神奈川県</option>
  <option value="15">岐阜県</option>
  <option value="16">京都府</option>
  <option value="17">熊本県</option>
  <option value="18">群馬県</option>
  <option value="19">高知県</option>
  <option value="20">埼玉県</option>
  <option value="21">佐賀県</option>
  <option value="22">滋賀県</option>
  <option value="23">静岡県</option>
  <option value="24">島根県</option>
  <option value="25">千葉県</option>
  <option value="26">東京都</option>
  <option value="27">徳島県</option>
  <option value="28">栃木県</option>
  <option value="29">鳥取県</option>
  <option value="30">富山県</option>
  <option value="31">長崎県</option>
  <option value="32">長野県</option>
  <option value="33">奈良県</option>
  <option value="34">新潟県</option>
  <option value="35">兵庫県</option>
  <option value="36">広島県</option>
  <option value="37">福井県</option>
  <option value="38">福岡県</option>
  <option value="39">福島県</option>
  <option value="40">北海道</option>
  <option value="41">三重県</option>
  <option value="42">宮城県</option>
  <option value="43">宮崎県</option>
  <option value="44">山形県</option>
  <option value="45">山口県</option>
  <option value="46">山梨県</option>
  <option value="47">和歌山県</option>
</select>

そうです、都道府県の選択メニューです。

この選択メニューを同じサイトの別ページでも使いたい時、あなたはどうしているでしょうか。この HTML コードを別ページのコードにコピペ(コピー&ペースト)していませんか?

頼 む か ら 定 数 に し て く れ

実は、都道府県を PHP で 1 つに共通化することができます。共通化すると、都道府県の県名や順番を変える際に修正箇所が 1 つになるので、作業時間が大幅に削減されます。さらに、修正箇所が減ることで抜け漏れ防止になり、ヒューマンエラーを減らすことができます。

実現方法は、別の PHP ファイルを作成して、都道府県を 配列 にした 定数 を定義します。定数 を定義するには define 関数か const 構文を利用します。構文の方が高速に処理されるので、今回は const 構文を利用します。

<?php
const PREFECTURES = [
  '愛知県',
  '青森県',
  '秋田県',
  '石川県',
  '茨城県',
  '岩手県',
  '愛媛県',
  '大分県',
  '大阪府',
  '岡山県',
  '沖縄県',
  '香川県',
  '鹿児島県',
  '神奈川県',
  '岐阜県',
  '京都府',
  '熊本県',
  '群馬県',
  '高知県',
  '埼玉県',
  '佐賀県',
  '滋賀県',
  '静岡県',
  '島根県',
  '千葉県',
  '東京都',
  '徳島県',
  '栃木県',
  '鳥取県',
  '富山県',
  '長崎県',
  '長野県',
  '奈良県',
  '新潟県',
  '兵庫県',
  '広島県',
  '福井県',
  '福岡県',
  '福島県',
  '北海道',
  '三重県',
  '宮城県',
  '宮崎県',
  '山形県',
  '山口県',
  '山梨県',
  '和歌山県'
];

この定数ファイルを PHP ファイルから require_once 文で読み込みます。

__DIR__ は使われる場所によって値が変化する マジカル定数 で、require_once されるファイルの存在するディレクトリを返します。ディレクトリ名の末尾にスラッシュはつかないので入力忘れに注意しましょう。

<?php require_once __DIR__ . '/constants.php'; ?>

あとは、foreach で都道府県の 配列 にある各要素を反復処理します。echo の短縮構文を利用して、option 要素の value 属性とメニュー項目名に値を設定します。

<?php require_once __DIR__ . '/constants.php'; ?>

<select name="prefectures">
  <?php foreach (PREFECTURES as $num => $prefecture): ?>
    <option value="<?= $num ?>"><?= $prefecture ?></option>
  <?php endforeach; ?>
</select>

これで、都道府県の選択メニューを無尽蔵に増やしても何も問題はありません。都道府県の県名や順番を変えたい時は、定数ファイルだけ修正すれば一括で変更ができます。

え、変数でいいんじゃないかだって?

変数は再代入できるので、別のエンジニアが値を変えてしまう可能性があります。信じられないかもしれませんが、都道府県の 定数 を定義しているにも関わらず、クラス のメソッドで都道府県の変数を定義しているコードを見たことがあります。油断大敵です。

処理の途中で変わらない値は定数化して、保守しやすいシステムを作りましょう、以上です。

おわりに

本番環境と検証環境の URL、データベースの接続情報、API の URL なども定数化しておくと便利です。