摘要:但是在的高版本語(yǔ)法中起,在某些特定場(chǎng)合,針對(duì)某些特定類(lèi)型,也是可以進(jìn)行語(yǔ)法約束的。注意在以前,類(lèi)型約束不能用于標(biāo)量類(lèi)型如或。這意味著嚴(yán)格聲明標(biāo)量是基于文件可配的。這個(gè)指令不僅影響參數(shù)的類(lèi)型聲明,也影響到函數(shù)的返回值聲明。
前言
眾所周知,在 強(qiáng)類(lèi)型 語(yǔ)言中,類(lèi)型約束 是語(yǔ)法上的要求,即:定義一個(gè)變量的時(shí)候,必須指定其類(lèi)型,并且以后該變量也只能存儲(chǔ)該類(lèi)型數(shù)據(jù)。
而我們的PHP是弱類(lèi)型語(yǔ)言,其特點(diǎn)就是無(wú)需為變量指定類(lèi)型,而且在其后也可以存儲(chǔ)任何類(lèi)型,當(dāng)然這也是使用PHP能快速開(kāi)發(fā)的關(guān)鍵點(diǎn)之一。但是在php的高版本語(yǔ)法中(PHP5起),在某些特定場(chǎng)合,針對(duì)某些特定類(lèi)型,也是可以進(jìn)行語(yǔ)法約束的。
介紹自PHP5起,我們就可以在函數(shù)(方法)形參中使用類(lèi)型約束了。
函數(shù)的參數(shù)可以指定的范圍如下:
必須為對(duì)象(在函數(shù)原型里面指定類(lèi)的名字);
接口;
數(shù)組(PHP 5.1 起);
callable(PHP 5.4 起)。
如果使用 NULL 作為參數(shù)的默認(rèn)值,那么在調(diào)用函數(shù)的時(shí)候依然可以使用 NULL 作為實(shí)參。
如果一個(gè)類(lèi)或接口指定了類(lèi)型約束,則其所有的子類(lèi)或?qū)崿F(xiàn)也都如此。
注意:在PHP7以前,類(lèi)型約束不能用于標(biāo)量類(lèi)型如 int 或 string。Traits 也不允許。
使用下面是官方給的例子:
var; } /** * 另一個(gè)測(cè)試函數(shù) * 第一個(gè)參數(shù)必須為數(shù)組 */ public function test_array(array $input_array) { print_r($input_array); } } /** * 第一個(gè)參數(shù)必須為遞歸類(lèi)型 */ public function test_interface(Traversable $iterator) { echo get_class($iterator); } /** * 第一個(gè)參數(shù)必須為回調(diào)類(lèi)型 */ public function test_callable(callable $callback, $data) { call_user_func($callback, $data); } } // OtherClass 類(lèi)定義 class OtherClass { public $var = "Hello World"; } ?>
函數(shù)調(diào)用的參數(shù)與定義的參數(shù)類(lèi)型不一致時(shí),會(huì)拋出一個(gè)可捕獲的致命錯(cuò)誤。
test("hello"); // 致命錯(cuò)誤:第一個(gè)參數(shù)必須為 OtherClass 類(lèi)的一個(gè)實(shí)例 $foo = new stdClass; $myclass->test($foo); // 致命錯(cuò)誤:第一個(gè)參數(shù)不能為 null $myclass->test(null); // 正確:輸出 Hello World $myclass->test($otherclass); // 致命錯(cuò)誤:第一個(gè)參數(shù)必須為數(shù)組 $myclass->test_array("a string"); // 正確:輸出數(shù)組 $myclass->test_array(array("a", "b", "c")); // 正確:輸出 ArrayObject $myclass->test_interface(new ArrayObject(array())); // 正確:輸出 int(1) $myclass->test_callable("var_dump", 1); ?>
類(lèi)型約束不只是用在類(lèi)的成員函數(shù)里,也能使用在函數(shù)里:
var; } // 正確 $myclass = new MyClass; MyFunction($myclass); ?>
類(lèi)型約束允許 NULL 值:
PHP7標(biāo)量類(lèi)型聲明 (PHP 7)
標(biāo)量類(lèi)型聲明 有兩種模式: 強(qiáng)制 (默認(rèn)) 和 嚴(yán)格模式。
現(xiàn)在可以使用下列類(lèi)型參數(shù)(無(wú)論用強(qiáng)制模式還是嚴(yán)格模式):
字符串(string),
整數(shù) (int),
浮點(diǎn)數(shù) (float),
布爾值 (bool)。
它們擴(kuò)充了PHP5中引入的其他類(lèi)型:類(lèi)名,接口,數(shù)組和 回調(diào)類(lèi)型。
以上范例的運(yùn)行結(jié)果會(huì)輸出:int(9)
要使用嚴(yán)格模式,一個(gè) declare 聲明指令必須放在文件的頂部。這意味著嚴(yán)格聲明標(biāo)量是基于文件可配的。 這個(gè)指令不僅影響參數(shù)的類(lèi)型聲明,也影響到函數(shù)的返回值聲明。
總結(jié)以上就是PHP類(lèi)型約束的大概簡(jiǎn)介和使用方法了,在使用PHP進(jìn)行開(kāi)發(fā)過(guò)程中,用到它的地方可能不是太多,我們最常看見(jiàn)或用到類(lèi)型約束的地方是在“依賴(lài)注入”的設(shè)計(jì)模式中,有興趣的可以看下我這篇介紹依賴(lài)注入的文章:聊一聊PHP的依賴(lài)注入(DI) 和 控制反轉(zhuǎn)(IoC)
參考官方文檔:http://php.net/manual/zh/language.oop5.typehinting.php
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://hztianpu.com/yun/21972.html
摘要:所有這些類(lèi)型,在內(nèi)部統(tǒng)一用一個(gè)叫做的結(jié)構(gòu)表示,在源代碼中這個(gè)結(jié)構(gòu)名稱(chēng)為。的具體定義在源代碼的文件中,下面是相關(guān)代碼的摘錄。 【轉(zhuǎn)】淺談PHP5中垃圾回收算法(Garbage Collection)的演化 前言 PHP是一門(mén)托管型語(yǔ)言,在PHP編程中程序員不需要手工處理內(nèi)存資源的分配與釋放(使用C編寫(xiě)PHP或Zend擴(kuò)展除外),這就意味著PHP本身實(shí)現(xiàn)了垃圾回收機(jī)制(Garbage C...
摘要:垃圾回收所謂垃圾就是指通過(guò)循環(huán)引用自己引用自己,目前只在類(lèi)型中有出現(xiàn)的形式而導(dǎo)致永遠(yuǎn)不為。當(dāng)出現(xiàn)垃圾之后,的引擎有對(duì)應(yīng)的垃圾回收機(jī)制。觸發(fā)這個(gè)機(jī)制的時(shí)機(jī)是每次出現(xiàn)減少時(shí)候。 自嘲)。。。。。2333,我覺(jué)得這是因?yàn)樵趐hp語(yǔ)言層面就幫我們解決了內(nèi)存回收的問(wèn)題,但這讓我在和java大牛們吹牛逼的時(shí)候,聽(tīng)到什么內(nèi)存泄露。。。。(納尼,我tmd怎么從來(lái)沒(méi)遇見(jiàn)過(guò))一臉懵逼。 本人小菜,如果下面...
摘要:但是在以來(lái),在面向?qū)ο笾?,為方法帶?lái)了類(lèi)型約束,然而這些都非常的雞肋,從文檔上可以看到。支持對(duì)象接口支持?jǐn)?shù)組支持匿名函數(shù)類(lèi)型約束不能用于標(biāo)量類(lèi)型如或。它的運(yùn)作方式,是在中設(shè)置一個(gè)標(biāo)志位,讓函數(shù)調(diào)用和返回類(lèi)型檢查符合類(lèi)型約束。 起點(diǎn) 眾所周知,PHP 是弱類(lèi)型語(yǔ)言,與其他強(qiáng)類(lèi)型語(yǔ)言項(xiàng)目,在這方面會(huì)有很多的坑,但是已經(jīng)發(fā)展到 PHP 7 之后,PHP 也對(duì)類(lèi)型約束有了所指,并且在許多流行框...
摘要:而哈士奇區(qū)別于普通狗,又有新的特征逗比,愛(ài)搗亂為了保證類(lèi)之間的松綁定,通常會(huì)繼承抽象類(lèi),而且是淺繼承只有一層子類(lèi)。如果知道所有類(lèi)都會(huì)共享一個(gè)公共的行為實(shí)現(xiàn),就使用抽象類(lèi),并在其中實(shí)現(xiàn)該行為。 為什么使用OOP OOP是一個(gè)模塊化的過(guò)程,目的是為了把復(fù)雜問(wèn)題簡(jiǎn)單化,一個(gè)模塊解決一個(gè)復(fù)雜問(wèn)題的某一個(gè)方面,即一個(gè)類(lèi)應(yīng)當(dāng)只有一個(gè)職責(zé) OOP區(qū)別于順序式編程與過(guò)程式編程,在于: 1.順序編程...
摘要:創(chuàng)業(yè)公司或新項(xiàng)目如何做技術(shù)選型一個(gè)創(chuàng)業(yè)公司或者新項(xiàng)目如何做技術(shù)選型個(gè)人認(rèn)為一定要記住這個(gè)根本新項(xiàng)目最先要解決的就是原型核心業(yè)務(wù)落地驗(yàn)證商業(yè)模式。開(kāi)源的最新的穩(wěn)定的根據(jù)業(yè)務(wù)選定技術(shù)棧之后,盡量擁抱開(kāi)源的東西。 創(chuàng)業(yè)公司或新項(xiàng)目如何做技術(shù)選型 一個(gè)創(chuàng)業(yè)公司或者新項(xiàng)目如何做技術(shù)選型?個(gè)人認(rèn)為一定要記住這個(gè)根本:新項(xiàng)目最先要解決的就是原型核心業(yè)務(wù)落地驗(yàn)證商業(yè)模式。具體實(shí)踐中,應(yīng)當(dāng)遵循以下原則和...
閱讀 3777·2021-09-24 09:48
閱讀 1262·2021-09-10 10:51
閱讀 3451·2019-08-30 13:03
閱讀 3484·2019-08-30 12:51
閱讀 1530·2019-08-30 11:22
閱讀 1250·2019-08-29 18:38
閱讀 2211·2019-08-29 16:41
閱讀 3438·2019-08-29 15:32