TaoGOGO的技术博客,始于2007年,通过文字分享技术、记录生活

php的count函数返回值的问题

2014-02-21

今天一个群里有个小伙伴说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.

类别: | 阅读:186359 | 评论:0 | 标签:php count

想收藏或者和大家分享这篇好文章→

“php的count函数返回值的问题”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

҉百度内部推荐,高级研发/PM(需2年以上工作经验)。
有意者微博私信联系~

微博言语

文章分类