php 源码解析--count
生活随笔
收集整理的這篇文章主要介紹了
php 源码解析--count
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
php內置了許多處理array的函數,這些函數功能簡單,但組合使用能夠形成強大的功能,非常好用~~
在php 源代碼中,array相關的內置函數定義在/ext/standard/php_array.h和/ext/standard/array.c中,主要的提供的函數如下:
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);由于偶也是初學,請見諒~~,先挑軟柿子捏,看看最簡單的count函數的實現
我們知道PHP中提供的count函數的形式是count(mixed var [, int mode]),后面這個參數表示是否recursive True表示遞歸計算,否則則只算第一層,
比方說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; //解析參數,z|l的形式表示第二個參數可選,PHP內部默認為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(...))會遞歸計算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?*///這里沒看明白~~后面補上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實現了SPL中的Countable接口,即實現了count函數,則會調用這個函數,并用這個函數的輸出作為最終的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,比方說//count("hello?world")=1//count(123)=1等等RETURN_LONG(1); break;} }轉載于:https://blog.51cto.com/7814265/1793465
總結
以上是生活随笔為你收集整理的php 源码解析--count的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery Lightbox图片放大预
- 下一篇: UWP Composition API