PHP言語(PHP他)
更新日 : 2022年5月14日
投稿日 : 2018年8月27日

【PHP】defineとは-defineに関わるトラブル事例も掲載-

【PHP】defineとは-defineに関わるトラブル事例も掲載-の画像

こんにちわ、PHPエンジニアのエンジニア婦人(@naho_osada)です。
私はPHPエンジニアとして8年~の経験があります。

ここではdefineの使い方と、defineに関わるトラブル事例を載せていきます。

defineとは

defineとは、PHP内で値を定義するときに使います。

定義、なのでプログラム中で変更できません。書き換えられたら困るような値を入れておきます。

詳細はこちらで確認してくださいね。

PHP:define – Manual

defineの使い方

プログラム中で絶対に書き換えられたくない情報を書きます。

データベースのユーザーIDやパスワード、APIKEYなどはプログラム中で書き換えられたらログインできなくなって困りますね。そういったものを書くと思ってください。

テストプログラムで書いてみるとわかりますが、一度定義したdefineはその後書き換えようとしても書き換えできません。

define('BASE_URL', 'https://engineer-lady.com');

echo BASE_URL;

define('BASE_URL', '値を書き換える');

echo BASE_URL;
テストプログラムの実行結果

1回目のecho BASE_URLは1行目のdefineで宣言したURLの文字列が出力されます。

しかし次のdefineでBASE_URLの値を書き換えようとしましたが、これは「既に宣言されていますよ」とNoticeが出ます。

書き換えができないため、2回目のecho BASE_URLは1行目で宣言したURLの文字列が出力されます。

defineに関わるトラブル事例

define定義した値を後から変えようとしてうまくいかず、なぜだろう?としばらく考えてしまったトラブルです。

設定ファイルが更新されたのに、値が更新されない問題

  1. 設定ファイルにdefineで値を定義する
  2. 1で設定した値を更新する必要が出てきたので、設定ファイルを更新する処理を入れた
  3. 1の設定ファイルが更新される(ファイル書き込み処理が完了する)
  4. 更新と同時にページの再読み込みをする(更新された設定値で表示する)

の流れを考えたのですが、これがどうしてもうまくいきませんでした。4の「更新と同時にページの再読み込みをする」が更新される前の値で表示されてしまうのです。

設定ファイルの更新が失敗しているのかと思いましたが、設定ファイルの書き込みは正常終了していました。

また、ブラウザを更新すると変更された設定値で表示されていました

ではなぜか?…勘のいい方はこれでわかったのではないかと思います。

原因:定義された値は変更できない

「定義された値」は変更を想定していない値です。変更されたら困る値です。

なので、それを変更しようとしても、プログラム中で再読み込みをかけても、1回のプログラム中では変更される前の値になってしまいます。

だから完全に処理完了するまでの間に、いくら設定ファイルを書き換えていて変わっていたとしても、完了して次の処理が始まる(ブラウザの更新)まで、読み込まれた値は変わらないのですね。

requireされていないんじゃないか、ファイルキャッシュの読み込みしてるからうまくいかないのか、はたまたブラウザのキャッシュの問題か、などなど色々考えてしまいましたが、全部違いましたね。

単に、defineという書き方をした時のルールを私が無視していたから予定通りの動きをしなかっただけでした。恥ずかしい…

「値を更新する」処理を実装する場合

defineを使っていないただの変数であれば、2の設定値が更新されたことで「更新された値」が表示されます。

$url = 'https://engineer-lady.com';

echo $url;

$url = '値を書き換える';

echo '<br>' . $url;
変数更新サンプルの実行結果

この場合も、どうしてもdefineにある値を変更しなければならないと判断し、またやめることができれば素直に変数にするのが良いですね。変更するかもしれない値ならそれは定数ではありません。

変数にすると「再読み込みで前の設定値が表示される」の件が解消され、予想通りの動きを見せてくれるようになりました。

もしdefineでトラブルになってしまった場合は、「そういえば…」と、この事例を思い出してみてください。参考になれば幸いです(‘ω’)ノ