摘要:但是在以來,在面向?qū)ο笾校瑸榉椒◣砹祟愋图s束,然而這些都非常的雞肋,從文檔上可以看到。支持對象接口支持數(shù)組支持匿名函數(shù)類型約束不能用于標量類型如或。它的運作方式,是在中設(shè)置一個標志位,讓函數(shù)調(diào)用和返回類型檢查符合類型約束。
起點
眾所周知,PHP 是弱類型語言,與其他強類型語言項目,在這方面會有很多的坑,但是已經(jīng)發(fā)展到 PHP 7 之后,PHP 也對類型約束有了所指,并且在許多流行框架中被大量使用比如Laravel,因為這確確實實在軟件開發(fā)過程中無論是運行,還是 IDE 的代碼提示都能為我們帶來極大的便利,下面就一步步來看看 PHP 中的類型約束。
早期的約束雖然 PHP 是隱式轉(zhuǎn)換,但是在實際開發(fā)中也會存在一些無法轉(zhuǎn)換的窘境,當然這些問題我們在開發(fā)階段很容易發(fā)現(xiàn),但是如果是一些動態(tài)的內(nèi)容導致不可控就會呈現(xiàn)在用戶面前,也就是 BUG ,在 PHP 中有一批以 is_* 開頭的方法用來做一些簡單類型判斷(這其中一些方法也是新方法沒有翻譯的基本都是)。
is_array — 檢測變量是否是數(shù)組
is_bool — 檢測變量是否是布爾型
is_callable — 檢測參數(shù)是否為合法的可調(diào)用結(jié)構(gòu)
is_countable — Verify that the contents of a variable is a countable value
is_double — is_float 的別名
is_float — 檢測變量是否是浮點型
is_int — 檢測變量是否是整數(shù)
is_integer — is_int 的別名
is_iterable — Verify that the contents of a variable is an iterable value
is_long — is_int 的別名
is_null — 檢測變量是否為 NULL
is_numeric — 檢測變量是否為數(shù)字或數(shù)字字符串
is_object — 檢測變量是否是一個對象
is_real — is_float 的別名
is_resource — 檢測變量是否為資源類型
is_scalar — 檢測變量是否是一個標量
is_string — 檢測變量是否是字符串
is_a — 如果對象屬于該類或該類是此對象的父類則返回 TRUE
is_subclass_of — 如果此對象是該類的子類,則返回 TRUE
在 PHP 5 之前,如果我們要做類型約束,那么就必須用到這些,這些方法對參數(shù)進行復雜的判斷,并處理錯誤返回給調(diào)用者。
但是在 PHP 5 以來,在面向?qū)ο笾校瑸?b>方法帶來了類型約束,然而這些都非常的雞肋,從文檔上可以看到。
PHP 5 支持 對象、接口、
PHP 5.1 支持 數(shù)組
PHP 5.4 支持匿名函數(shù)
類型約束不能用于標量類型如 int 或 string。Traits 也不允許。
在 PHP 5 中其實光是第一條,就夠大部分場景使用,但是也有一些知名問題,比如最后一條的 不支持標量類型 ,也就是說支持不是很全面,而且還有一種情況沒有考慮 那就 null 雖然 null 是一個特殊類型,但是有時候當數(shù)據(jù)不可控時也會出現(xiàn),而且,在 PHP 5 階段,類型約束并沒有被很好的使用,或許是那個時候并不是那么的重視,畢竟弱類型是 PHP 的一大特點,但也是致命傷,甚至很多時候被強類型語言牽著鼻子走。
PHP 7PHP 7 相對于先前的PHP版本可謂是煥然一新。
錯誤與異常的處理
標量類型聲明
返回值類型聲明
可為空(Nullable)類型 (PHP 7.1)
Void 函數(shù)
比較扎眼的就是完善了對類型限制的支持,補上了之前的短缺,包括標量類型、返回值類型,而且,在 PHP 7.1 中還加入了嚴格類型驗證。
強制類型驗證 strict_types/declare()指令默認情況下,所有的PHP文件都處于弱類型校驗?zāi)J健P碌膁eclare指令,通過指定strict_types的值(1或者0),1表示嚴格類型校驗?zāi)J剑饔糜诤瘮?shù)調(diào)用和返回語句;0表示弱類型校驗?zāi)J健?/p>
declare(strict_types=1)必須是文件的第一個語句。如果這個語句出現(xiàn)在文件的其他地方,將會產(chǎn)生一個編譯錯誤,塊模式是被明確禁止的。
類似于encoding指令,但不同于ticks指令,strict_types指令只影響指定使用的文件,不會影響被它包含(通過include等方式)進來的其他文件。該指令在運行時編譯,不能修改。它的運作方式,是在opcode中設(shè)置一個標志位,讓函數(shù)調(diào)用和返回類型檢查符合類型約束。
舉個文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31198.html
摘要:工程化的思維可以在項目起手的階段大致構(gòu)建出整個框架,然后逐步的去添加功能。工程化的思維可以快速的解決問題,從面到點,而不是從點到線。 任何計算機語言都是工具,都是用來解決問題。所有的現(xiàn)代編程語言都有相同之處,基本類型值(string number boolean......),引用類型值(數(shù)組,對象,函數(shù),類),語句(if,switch,while,do while......),甚至...
摘要:工程化的思維可以在項目起手的階段大致構(gòu)建出整個框架,然后逐步的去添加功能。工程化的思維可以快速的解決問題,從面到點,而不是從點到線。 任何計算機語言都是工具,都是用來解決問題。所有的現(xiàn)代編程語言都有相同之處,基本類型值(string number boolean......),引用類型值(數(shù)組,對象,函數(shù),類),語句(if,switch,while,do while......),甚至...
摘要:但是在的高版本語法中起,在某些特定場合,針對某些特定類型,也是可以進行語法約束的。注意在以前,類型約束不能用于標量類型如或。這意味著嚴格聲明標量是基于文件可配的。這個指令不僅影響參數(shù)的類型聲明,也影響到函數(shù)的返回值聲明。 前言 眾所周知,在 強類型 語言中,類型約束 是語法上的要求,即:定義一個變量的時候,必須指定其類型,并且以后該變量也只能存儲該類型數(shù)據(jù)。 而我們的PHP是弱類型語言...
摘要:導語所謂類型約束,即定義一個變量的時候,必須指定其類型,并且以后該變量也只能存儲該類型數(shù)據(jù)。當類型約束為接口時,可以傳入實現(xiàn)接口的類或。參考資料類型約束標量類型聲明。 導語 所謂類型約束,即定義一個變量的時候,必須指定其類型,并且以后該變量也只能存儲該類型數(shù)據(jù)。PHP 雖然是弱類型語言,但是在 PHP 5 已經(jīng)支持類型約束,包括對象、接口、數(shù)組,在 PHP 7 之后支持標量類型約束,下...
閱讀 2800·2021-11-22 14:44
閱讀 541·2021-11-22 12:00
閱讀 3683·2019-08-30 15:54
閱讀 1570·2019-08-29 17:15
閱讀 1898·2019-08-29 13:50
閱讀 1107·2019-08-29 13:17
閱讀 3513·2019-08-29 13:05
閱讀 1181·2019-08-29 11:31