今天一个群里有个小伙伴说php的count函数比较诡异。
看了下源码(/PHP_5_3/ext/standard/array.c),代码如下:
300PHP_FUNCTION(count) 301{ 302 zval *array; 303 long mode = COUNT_NORMAL; 304 305 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE) { 306 return; 307 } 308 309 switch (Z_TYPE_P(array)) { 310 case IS_NULL: 311 RETURN_LONG(0); 312 break; 313 case IS_ARRAY: 314 RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC)); 315 break; 316 case IS_OBJECT: { 317#ifdef HAVE_SPL 318 zval *retval; 319#endif 320 /* first, we check if the handler is defined */ 321 if (Z_OBJ_HT_P(array)->count_elements) { 322 RETVAL_LONG(1); 323 if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) { 324 return; 325 } 326 } 327#ifdef HAVE_SPL 328 /* if not and the object implements Countable we call its count() method */ 329 if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) { 330 zend_call_method_with_0_params(&array, NULL, NULL, "count", &retval); 331 if (retval) { 332 convert_to_long_ex(&retval); 333 RETVAL_LONG(Z_LVAL_P(retval)); 334 zval_ptr_dtor(&retval); 335 } 336 return; 337 } 338#endif 339 } 340 default: 341 RETURN_LONG(1); 342 break; 343 } 344} 345/* }}} */
如此看来count函数只会计算类型为null,array,object的变量,其他的类型都会返回1。
对于count(常量)的值,因为常量的值只能是标量,而未定义的常量会转换为字符串,在常量不为null的时候,count(常量)的返回值是1.