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