0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPで定数が定義されているか確認する

Posted at

はじめに

 Qiita初投稿です。PHPで定数が定義されているか確認する際にちょっと詰まったので備忘録も兼ねて投稿します。

実行環境

  • PHP8.1.29

変数の場合

 変数が宣言されているときにはisset関数を使用します。以下の例をご覧ください。

isset_check.php
<?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と同じ感覚で以下のように記述してしまいました。

defined_check_bad.php
<?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の引数には定数ではなく定数名を代入しないと行けなかったんですね。すなわち以下のように書く必要があるんです。

defined_check_good.php
<?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");
?>

おわりに

 いかがでしたでしょうか。私自身プログラミング経験が浅く数分間「なんで動かないんだろう?」と苦悶していました。同じミスをしてしまった方の参考になれば幸いです。最後までお読みいただきありがとうございました。

参考

PHP: isset - Manual
PHP: defined - Manual

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?