defined関数の落とし穴
bool defined ( string name )
2年前くらいにハマった落とし穴。
cvsが見えないので情報だけで勘弁を。
/(php-src dir)/Zend/zend_builtin_functions.c /* {{{ proto bool defined(string constant_name) Check whether a constant exists */ ZEND_FUNCTION(defined) { zval **var; zval c; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &var)==FAILURE) { ZEND_WRONG_PARAM_COUNT(); } convert_to_string_ex(var); if (zend_get_constant((*var)->value.str.val, (*var)->value.str.len, &c TSRMLS_CC)) { zval_dtor(&c); RETURN_TRUE; } else { RETURN_FALSE; } } /* }}} */
って、比較的新しいバージョンだと修正されているのね。。。
昔はbool値ではなくてlong値を返していました。
/(php-src dir)/Zend/zend_builtin_functions.c /* {{{ proto bool defined(string constant_name) Check whether a constant exists */ ZEND_FUNCTION(defined) { zval **var; zval c; if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &var)==FAILURE) { ZEND_WRONG_PARAM_COUNT(); } convert_to_string_ex(var); if (zend_get_constant((*var)->value.str.val, (*var)->value.str.len, &c TSRMLS_CC)) { zval_dtor(&c); RETURN_LONG(1); } else { RETURN_LONG(0); } } /* }}} */
この一件があって「===」を使うのが怖い。。。うがっ。