国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
[PHP源碼閱讀]count函數(shù),php源碼count函數(shù)
count
參數(shù)說明
運(yùn)行示例
普通應(yīng)用
多維數(shù)組
數(shù)字和字符串
普通對(duì)象
array-like對(duì)象
實(shí)現(xiàn)Countable接口對(duì)象
運(yùn)行步驟
源碼解讀
小結(jié)
首頁 后端開發(fā) php教程 [PHP源碼閱讀]count函數(shù),php源碼count函數(shù)_PHP教程

[PHP源碼閱讀]count函數(shù),php源碼count函數(shù)_PHP教程

Jul 12, 2016 am 08:51 AM
count函數(shù)

[PHP源碼閱讀]count函數(shù),php源碼count函數(shù)

在PHP編程中,在遍歷數(shù)組的時(shí)候經(jīng)常需要先計(jì)算數(shù)組的長度作為循環(huán)結(jié)束的判斷條件,而在PHP里面對(duì)數(shù)組的操作是很頻繁的,因此count也算是一個(gè)常用函數(shù),下面研究一下count函數(shù)的具體實(shí)現(xiàn)。

我在github上有對(duì)PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個(gè)star。PHP5.4源碼注解??梢酝ㄟ^commit記錄查看已添加的注解。

count

int <span>count</span> ( <span>mixed</span> <span>$array_or_countable</span> [, int <span>$mode</span> = COUNT_NORMAL ] )

count函數(shù)計(jì)算數(shù)組或者對(duì)象里面的所有元素個(gè)數(shù)。

對(duì)于對(duì)象來說,如果你安裝了SPL擴(kuò)展,可以通過實(shí)現(xiàn)Countable接口來調(diào)用count函數(shù)。Countable接口有且僅有一個(gè)方法Countable::count(),該方法的返回count()函數(shù)的返回值。

參數(shù)說明

mode

如果參數(shù)mode設(shè)為COUNT_RECURSIVE(或1),count()會(huì)遞歸地計(jì)算該數(shù)組。在計(jì)算多維數(shù)組的時(shí)候特別有用。

如果第一個(gè)參數(shù)不是數(shù)組或者實(shí)現(xiàn)Countable接口的對(duì)象,count函數(shù)將返回1。

注意:count函數(shù)可以檢測遞歸避免無限循環(huán),但會(huì)在遇到無限遞歸或得到比期望值大的時(shí)候返回E_WARNING提示。

運(yùn)行示例

普通應(yīng)用

<span>$arr1</span> = <span>array</span>(1, 2, 3, 4, 5<span>);
</span><span>$val1</span> = <span>count</span>(<span>$arr1</span>); <span>//</span><span> 5</span>

多維數(shù)組

<span>$arr2</span> = <span>array</span>('apple', 'banana', <span>array</span>('cat', 'camel'), 'dog'<span>);
</span><span>$val2_1</span> = <span>count</span>(<span>$arr2</span>); <span>//</span><span> 4</span>
<span>$val2_2</span> = <span>count</span>(<span>$arr2</span>, 1); <span>//</span><span> 6</span>

數(shù)字和字符串

<span>$str</span> = "hello world"<span>;
</span><span>$int_val</span> = 1<span>;
</span><span>$val3</span> = <span>count</span>(<span>$str</span>); <span>//</span><span> 1</span>
<span>$val4</span> = <span>count</span>(<span>$int_val</span>); <span>//</span><span> 1</span>

普通對(duì)象

<span>class</span><span> User {
    </span><span>private</span> <span>$name</span><span>;
    </span><span>private</span> <span>$address</span><span>;
}

</span><span>$user</span> = <span>new</span><span> User();
</span><span>$val5</span> = <span>count</span>(<span>$user</span>); <span>//</span><span> 1</span>
<span>$val6</span> = <span>count</span>((<span>array</span>) <span>$user</span>); <span>//</span><span> 2</span>

array-like對(duì)象

    <span>class</span> User <span>extends</span><span> ArrayObject {
        </span><span>private</span> <span>$name</span><span>;

        </span><span>public</span> <span>function</span><span> __construct() {
            </span><span>$this</span>->name = 'hhq'<span>;
        }

        </span><span>public</span> <span>function</span><span> getName() {
            </span><span>return</span> <span>$this</span>-><span>name;
        }

        </span><span>public</span> <span>function</span> <span>count</span><span>() {
            </span><span>return</span> 2<span>;
        }

    }

    </span><span>$user2</span> = <span>new</span><span> User();
    </span><span>$val7</span> = <span>count</span>(<span>$user2</span>); <span>//</span><span> 2</span>

實(shí)現(xiàn)Countable接口對(duì)象

    <span>class</span> User <span>implements</span><span> Countable {
        </span><span>public</span> <span>function</span> <span>count</span><span>() {
            </span><span>return</span> 3<span>;
        }
    }

    </span><span>$user3</span> = <span>new</span><span> User();
    </span><span>$val8</span> = <span>count</span>(<span>$user3</span>); <span>//</span><span> 3</span> 

運(yùn)行步驟

<p>進(jìn)入switch語句檢測參數(shù)類型</p>
<p>  如果是NULL,直接返回0</p>
<p>  如果是數(shù)組,調(diào)用php_count_recursive函數(shù)機(jī)選數(shù)組元素個(gè)數(shù)</p>
<p>  如果是對(duì)象,先檢查是否為數(shù)組對(duì)象(array-like object),如果是,則計(jì)算數(shù)組對(duì)象的數(shù)量</p>
<p>  否則,如果對(duì)象實(shí)現(xiàn)了Countable接口,則調(diào)用Countable的count方法</p>
<p>  最后,其他類型比如整型數(shù)組或字符串,都返回1。</p>

源碼解讀

如果是普通數(shù)組,count函數(shù)會(huì)調(diào)用php_count_recursive函數(shù)實(shí)現(xiàn)其功能的運(yùn)行步驟如下:

<p>如果當(dāng)前hash Bucket被遞歸訪問的次數(shù)大于1,說明重復(fù)遞歸,染回E_WARNING錯(cuò)誤</p>
<p>否則計(jì)算當(dāng)前數(shù)組層數(shù)的數(shù)組元素個(gè)數(shù)</p>
<p>如果有遞歸參數(shù)選項(xiàng),則繼續(xù)遞歸訪問</p>

如果參數(shù)是對(duì)象類型,實(shí)現(xiàn)時(shí)會(huì)先判斷handler是否被定義。而handler是PHP內(nèi)核中對(duì)象的結(jié)構(gòu)體,其中包含有count_elements字段,實(shí)際上是一個(gè)函數(shù)。如果某個(gè)對(duì)象表現(xiàn)得想數(shù)組一樣,即通常說的array-like object,那么就會(huì)執(zhí)行count_elements函數(shù)。具體實(shí)現(xiàn)是類繼承PHP的ArrayObject,并在類里面實(shí)現(xiàn)count函數(shù),具體調(diào)用的就是count函數(shù),如果類沒有實(shí)現(xiàn)count函數(shù),則count返回0,否則返回對(duì)象的count函數(shù)的返回值。

如果是其他的數(shù)據(jù)類型
1、字符串

2、數(shù)字

3、對(duì)象分支中兩個(gè)if判斷都為false的情況,即沒有繼承ArrayObject且沒有實(shí)現(xiàn)Countable接口。

這些類型通通返回1。

需要注意的是,如果需要計(jì)算的是對(duì)象的屬性數(shù)量,可以先將對(duì)象轉(zhuǎn)換成數(shù)組,然后調(diào)用count函數(shù)。如:
$count_value = count((array) $user);

小結(jié)

閱讀count函數(shù)的源碼過程中,在其中一步卡住了,就是if (Z_OBJ_HT_P(array)->count_elements)這一步,因?yàn)槭冀K無法寫出進(jìn)入這個(gè)分支的demo,在網(wǎng)上搜索了很多資料也未果,因此請(qǐng)教了TIPI的reeze,最終得到了想要的答案。不懂就要問,哈哈。

?

原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬望告知。

如果本文對(duì)你有幫助,請(qǐng)點(diǎn)下推薦吧,謝謝^_^

?

最后再安利一下,我在github有對(duì)PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個(gè)star。PHP5.4源碼注解??梢酝ㄟ^commit記錄查看已添加的注解。

更多源碼文章,歡迎訪問個(gè)人主頁繼續(xù)查看:hoohack

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1130480.htmlTechArticle[PHP源碼閱讀]count函數(shù),php源碼count函數(shù) 在PHP編程中,在遍歷數(shù)組的時(shí)候經(jīng)常需要先計(jì)算數(shù)組的長度作為循環(huán)結(jié)束的判斷條件,而在PHP里面對(duì)...
本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
PHP變量范圍解釋了 PHP變量范圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次并在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助于避免錯(cuò)誤并提升代碼穩(wěn)定性。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗(yàn)證來源與類型、控制文件名與路徑、設(shè)置服務(wù)器限制并二次處理媒體文件。1.驗(yàn)證上傳來源通過token防止CSRF并通過finfo_file檢測真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串并根據(jù)檢測類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

在PHP中評(píng)論代碼 在PHP中評(píng)論代碼 Jul 18, 2025 am 04:57 AM

PHP注釋代碼常用方法有三種:1.單行注釋用//或#屏蔽一行代碼,推薦使用//;2.多行注釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧注釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

撰寫PHP評(píng)論的提示 撰寫PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋應(yīng)解釋“為什么”而非“做了什么”,避免冗余或過于簡單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

易于效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

如何通過php中的索引訪問字符串中的字符 如何通過php中的索引訪問字符串中的字符 Jul 12, 2025 am 03:15 AM

在PHP中獲取字符串特定索引字符可用方括號(hào)或花括號(hào),但推薦方括號(hào);索引從0開始,超出范圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實(shí)際應(yīng)用中循環(huán)訪問前應(yīng)檢查字符串長度,動(dòng)態(tài)字符串需驗(yàn)證有效性,多語言項(xiàng)目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

See all articles