php 源码解析--count
生活随笔
收集整理的這篇文章主要介紹了
php 源码解析--count
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
php內(nèi)置了許多處理array的函數(shù),這些函數(shù)功能簡(jiǎn)單,但組合使用能夠形成強(qiáng)大的功能,非常好用~~
在php 源代碼中,array相關(guān)的內(nèi)置函數(shù)定義在/ext/standard/php_array.h和/ext/standard/array.c中,主要的提供的函數(shù)如下:
PHP_FUNCTION(ksort); PHP_FUNCTION(krsort); PHP_FUNCTION(natsort); PHP_FUNCTION(natcasesort); PHP_FUNCTION(asort); PHP_FUNCTION(arsort); PHP_FUNCTION(sort); PHP_FUNCTION(rsort); PHP_FUNCTION(usort); PHP_FUNCTION(uasort); PHP_FUNCTION(uksort);由于偶也是初學(xué),請(qǐng)見(jiàn)諒~~,先挑軟柿子捏,看看最簡(jiǎn)單的count函數(shù)的實(shí)現(xiàn)
我們知道PHP中提供的count函數(shù)的形式是count(mixed var [, int mode]),后面這個(gè)參數(shù)表示是否recursive True表示遞歸計(jì)算,否則則只算第一層,
比方說(shuō)count(array('a'=>'1',‘b'=>array(‘c’=>2))=2;而count(array('a'=>'1',‘b'=>array(‘c’=>2),true)=3
PHP_FUNCTION(count) {zval?*array;long?mode?=?COUNT_NORMAL; //解析參數(shù),z|l的形式表示第二個(gè)參數(shù)可選,PHP內(nèi)部默認(rèn)為COUNT_NORMALif?(zend_parse_parameters(ZEND_NUM_ARGS()?TSRMLS_CC,?"z|l",?&array,?&mode)?==?FAILURE)?{ return;} switch?(Z_TYPE_P(array))?{ case?IS_NULL: //count(NULL)這種直接返回1RETURN_LONG(0); break; case?IS_ARRAY: //count(array(...))會(huì)遞歸計(jì)算RETURN_LONG?(php_count_recursive?(array,?mode?TSRMLS_CC)); break; case?IS_OBJECT:?{#ifdef?HAVE_SPLzval?*retval;#endif/*?first,?we?check?if?the?handler?is?defined?*///這里沒(méi)看明白~~后面補(bǔ)上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;}}#ifdef?HAVE_SPL//count(Obj)//如果obj實(shí)現(xiàn)了SPL中的Countable接口,即實(shí)現(xiàn)了count函數(shù),則會(huì)調(diào)用這個(gè)函數(shù),并用這個(gè)函數(shù)的輸出作為最終的count的返回值/***?class?Test?implements?Countable{*? public?function?count(){*? return?5;*? }*?}*?$test=new?Test();*?那么count($test)=5*//*?if?not?and?the?object?implements?Countable?we?call?its?count()?method?*/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} default: //其他的一概返回1,比方說(shuō)//count("hello?world")=1//count(123)=1等等RETURN_LONG(1); break;} }轉(zhuǎn)載于:https://blog.51cto.com/7814265/1793465
總結(jié)
以上是生活随笔為你收集整理的php 源码解析--count的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jQuery Lightbox图片放大预
- 下一篇: php 验证码