プログラミンググローバルに展開してしまうdefineを用いて定義した定数は、定義したあと実行するコードのどの箇所からでも参照できます。モダンプログラミングでよく言われますが、グローバル空間にいろいろなものを定義しまくるのはあまり行儀がよいものではありません。それでも常に定義するときに衝突を考慮しなければいけないこと、衝突を避けるためには必然的に長い名前になり、アクセシビリティが悪くなるということになります。PHPの組み込み関数群がそれらが引数として用いるための定数を大量にグローバルにぶちまけているのも問題です。"var_dump(NOT_EXIST_CONSTANT);"以下の様な結果になります。"NOT_EXIST_CONSTANT"一応Noticeは出るのですが、出るだけで普通に文字列として扱われてしまいます。これは、変数名の$つけ忘れや定数のタイポなどがそのまま動いてしまうということを意味しています。万が一にもNoticeを出力しない環境だと、気づかないままリリースしてしまう可能性もあります。人間がミスをする前提で設計されたプログラミング言語のほうが、バグは作り込みにくいでしょう。defineは関数であるPHPの定数を作るdefineは関数であり、引数として変数をとることができます。$baz);}といったコードを書けます。実行時によってあったりなかったり、名前や値がすこしずつ違ったりといった定数と呼べるのか定かではない定数を作れるということです。こんなコードを書こうと考える人はそういないでしょうが、書けるというのも事実です。このような定数の定義が万が一あったなら、先ほどの問題と合わせて非常にバグを生みやすい状態であるといえるでしょう。以上のように、いろいろ怖すぎるPHPの定数。対策はこんな感じでしょうか。できるだけ定数を使わず、クラスのconstなどを利用する。しても使う場合は、しっかりCIでコードチェックを行い、変数名タイポなどは自動的に判別できる環境を作る。defineの引数はなるべく即値とする。定数を全く使わなかったとしても、変数名の$のつけ忘れなどで予期せぬ挙動を起こすPHPの定数の仕様。あまりに罪深すぎるでしょう。(1)引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。