かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP 定数の有無を確認したい。

WordPressのテンプレートなどで環境定数があれば、何かを出力したいとかの時。

isset() を使うとエラーになる

<?php if( issset(IS_PRODUCTION) && IS_PRODUCTION === true ) : ?>
// GoogleAnalytics のスクリプトを表示 
<?php endif; ?>

PHP Fatal error:  Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in ~

isset()変数のみを受け付けるらしい。
なので、定数IS_PRODUCTIONが定義されていてもエラーになる。

定数だと判りきっている場合は、defined() を使うのが確実

<?php if( defined("IS_PRODUCTION") ) :?>
// GoogleAnalytics のスクリプトを表示 
<?php endif; ?>

defined() を使う際に少し注意が必要です。

bool defined ( string $name )
defined() は 定数にしか適用できません。
PHP: defined - Manual

引数を文字列で渡してあげないと定数が定義されれいても常にfalseになってしまい上手く動作しません。

<?php
define('TEST', 'foo');
var_dump( defined(TEST) ); // => 常に false

PHP5.4以降なら empty() が使える

<?php if( !empty(IS_PRODUCTION) && IS_PRODUCTION === true ) : ?>
// GoogleAnalytics のスクリプトを表示 
<?php endif; ?>

define('IS_PRODUCTION', true); とかで定数IS_PRODUCTIONが定義されていなくても大丈夫。
但し、empty()は定数が定義されているかをチェックしているわけでないので、
IS_PRODUCTIONが定義されていない時と、IS_PRODUCTIONnullの時同じ挙動になるので、厳密に定義されているかを調べるのには使えない。

 

定数だと判りきっている場合は、defined()を使うのが確実そうです。
厳密に定数が定義されているかを調べたいのではなく、分岐などで定数の定義漏れでのエラーに対する保険と言うことであれば、empty()も使えると言えば使えそうです。(※ 但し、PHP5.4以降)


[参考]

一歩先にいくWordPressのカスタマイズがわかる本

一歩先にいくWordPressのカスタマイズがわかる本