はじめに
Qiita初投稿です。PHPで定数が定義されているか確認する際にちょっと詰まったので備忘録も兼ねて投稿します。
実行環境
- PHP8.1.29
変数の場合
変数が宣言されているときにはisset
関数を使用します。以下の例をご覧ください。
<?php
$foo = "foo";
$hoge = null;
var_dump(isset($foo)); //bool(true)
var_dump(isset($bar)); //bool(false)
var_dump(isset($hoge)); //bool(false)
?>
定数の場合
定数の場合はisset
の定数版であるdefined
関数を使います。引数は
私の場合は入門書でisset
を先に知ったので、issetと同じ感覚で以下のように記述してしまいました。
<?php
const FOO = "foo";
var_dump(defined(FOO)); //bool(false)
var_dump(defined(BAR)); //PHP Fatal error: Uncaught Error: Undefined constant "BAR" in 〜
?>
あれれ〜おっかしいぞ〜。3行目はbool(true)、4行目はbool(false)を予期していたのに、fatal errorが発生してしまいました。エラーのUndefined constant "BAR" in 〜
に関しては、 定数が定義されているのか調べたいんだから定義されていない場合もあるだろ! とツッコミを入れたくなります。が、マニュアルを見るとすべて解決しました。
defined()
の引数には定数「名」を渡さなければならない
defined — 指定した名前の定数が存在するかどうかを調べる
defined(string $constant_name): bool
(中略)
パラメータ:constant_name
定数名。
戻り値
constant_name で指定した名前の定数が定義されている場合にtrue、その他の場合にfalseを返します。
はい。つまりdefined
の引数には定数ではなく定数名を代入しないと行けなかったんですね。すなわち以下のように書く必要があるんです。
<?php
const FOO = "foo";
var_dump(defined("FOO")); //bool(true)
var_dump(defined("BAR")); //bool(false)
?>
ちなみに、上のdefined_check_bad.php
のコードは、FOOに代入されている値、すなわち"foo"という名前の変数が定義されているかという意味になってしまいます。以下の2つは同じ意味です。
<?php
const FOO = "BAR";
var_dump(FOO);
?>
<?php
var_dump("BAR");
?>
おわりに
いかがでしたでしょうか。私自身プログラミング経験が浅く数分間「なんで動かないんだろう?」と苦悶していました。同じミスをしてしまった方の参考になれば幸いです。最後までお読みいただきありがとうございました。