日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 源码解析--count

發布時間:2025/1/21 php 75 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。