今天试调程序的时候突然发现了count这个函数的一个问题
不知各位是否也碰到过,也许是在下学艺不精吧!
下面贴出来一下,供跟我一样的朋友们分享我们做程序一般都是用 count读取array数组的长度
这个是在平常不过了的!
不过不知道你们有没有试过
当count去读一个变量时会有什么效果,结果又是什么在下做了一个小测试:
1.count读取非null变量
   定义变量: $var = '1';//此处变量的数据类型不限可以是false也行
   结果输出: echo count($var);//最终显示结果 1 .
2.count读取null变量,即空值时
   定义变量: $var = null;
   结果输出: echo count($var);//最终显示结果 0.当然这里不测试数组类型的了,这个用得太多,基本上大家都知道的!
这两个测试,说明了count不是专门为数组所用的!count 这个读取变量所存储的变量个数
就好像是C语言中的数组指针一样,这个指针的游动可以知道数组的长度
当数组的长度为1时即为简单数据类型如$var = '1',此时指针也可以遍历到它,所以它的结果会是1以上是个人的胡说八道的,因为没有什么依据
跟我一样不清楚的大家可以一起来讨论,牛人,大侠们则点点精.
(小弟第一次在这上面发贴子,不足的地方,大家多多包涵)

解决方案 »

  1.   

    其实php手册中已经对返回值做出了说明
    http://cn2.php.net/manual/en/function.count.phpReturn Values中提到
    If var is not an array or an object with implemented Countable interface, 1 will be returned. There is one exception, if var is NULL, 0 will be returned.
    也就是说如果传入参数不是数组或者是没有提供Countable接口(Description 中有对该接口的说明 The interface has exactly one method, count(), which returns the return value for the count() function. )的对象时返回1,返回0的例外是NULL。查一下源代码,这里用5.2.10作为参考
    ext/standard/array.c中309行开始
    /* {{{ proto int count(mixed var [, int mode])
       Count the number of elements in a variable (usually an array) */
    PHP_FUNCTION(count)
    {
    zval *array;// 第一个参数 $var
    long mode = COUNT_NORMAL;// 第二个参数 $mode

    if (zend_parse_parameters (ZEND_NUM_ARGS() TSRMLS_CC, "z|l", &array, &mode) == FAILURE)
    return;

    switch (Z_TYPE_P(array)) {// 取得 $var 的类型
    case IS_NULL:// NULL 直接返回0
    RETURN_LONG(0);
    break;
    case IS_ARRAY:// 数组
    RETURN_LONG (php_count_recursive (array, mode TSRMLS_CC));
    break;
    case IS_OBJECT: {// 对象
    #ifdef HAVE_SPL
    /* it the object implements Countable we call its count() method */
    zval *retval; if (Z_OBJ_HT_P(array)->get_class_entry && instanceof_function(Z_OBJCE_P(array), spl_ce_Countable TSRMLS_CC)) {
    zend_call_method_with_0_params(&array, NULL, NULL, "count", &retval);
    if (retval) {
    convert_to_long_ex(&retval);
    RETVAL_LONG(Z_LVAL_P(retval));
    zval_ptr_dtor(&retval);
    }
    return;
    }
    #endif
    /* if not we return the number of properties (not taking visibility into account) */
    if (Z_OBJ_HT_P(array)->count_elements) {
    RETVAL_LONG(1);
    if (SUCCESS == Z_OBJ_HT(*array)->count_elements(array, &Z_LVAL_P(return_value) TSRMLS_CC)) {
    return;
    }
    }
    }
    default:// 其他类型返回1
    RETURN_LONG(1);
    break;
    }
    }