- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PHP源码阅读:count函数
在PHP 编程中,在遍历数组的时候经常需要先计算数组的长度作为循环结束的
判断条件,而在PHP 里面对数组的操作是很频繁的,因此count 也算是一个常
用函数,下面研究一下count 函数的具体实现。
count
int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )
count 函数计算数组或者对象里面的所有元素个数。
对于对象来说,如果你安装了SPL 扩展,可以通过实现Countable 接口来调用
count 函数。Countable 接口有且仅有一个方法Countable::count(),该方法的返
回count()函数的返回值。
参数说明
mode
如果参数mode 设为COUNT_RECURSIVE(或1),count()会递归地计算该数组。
在计算多维数组的时候特别有用。
如果第一个参数不是数组或者实现Countable 接口的对象,count 函数将返回1。
注意:count 函数可以检测递归避免无限循环,但会在遇到无限递归或得到比期
望值大的时候返回E_WARNING 提示。
运行示例
普通应用
$arr1 = array(1,2,3,4,5);
$val1 = count($arr1);// 5
多维数组
$arr2 = array(apple,banana,array(cat,camel),dog);
$val2_1 = count($arr2);// 4
$val2_2 = count($arr2,1);// 6
数字和字符串
$str = hello world;
$int_val = 1;
$val3 = count($str);// 1
$val4 = count($int_val);// 1
普通对象
classUser{
private$name;
private$address;
}
$user = newUser();
$val5 = count($user);// 1
$val6 = count((array)$user);// 2
array-like 对象
classUserextendsArrayObject{
private$name;
publicfunction__construct(){
$this-name = hhq;
}
publicfunctiongetName(){
return$this-name;
}
publicfunctioncount(){
return2;
}
}
$user2 = newUser();
$val7 = count($user2);// 2
实现Countable 接口对象
classUserimplementsCountable{
publicfunctioncount(){
return3;
}
}
$user3 = newUser();
$val8 = count($user3);// 3
运行步骤
进入switch 语句检测参数类型
如果是NULL,直接返回0
如果是数组,调用php_count_recursive 函数机选数组元素个数
如果是对象,先检查是否为数组对象(array-like object),如果是,则计算数组
对象的数量
否则,如果对象实现了Countable 接口,则调用Countable 的count 方法
最后,其他类型比如整型数组或字符串,都返回1。
源码解读
如果是普通数组,count 函数会调用php_count_recursive 函数实现其功能的运
行步骤如下:
如果当前hash Bucket 被递归访问的次数大于1,说明重复递归,染回
E_WARNING 错误
否则计算当前数组层数的数组元素个数
如果有递归参数选项,则继续递归访问
如果参数是对象类型,实现时会先判断handler 是否被定义。而handler 是PHP
内核中对象的结构体,其中包含有count_elements 字段,实际上是一个函数。
如果某个对象表现得想数组一样,即通常说的array-like object,那么就会执行
count_elements 函数。具体实现是类继承PHP 的ArrayObject ,并在类里面实
现count 函数,具体调用的就是count 函数,如果类没有实现count 函数,则count
返回0,否则返回对象的count 函数的返回值。
如果是其他的数据类型
1、字符串
2、数字
3、对象分支中两个if 判断都为false 的情况,即没有继
文档评论(0)