成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

淺談PHP的類(lèi)型約束

forsigner / 2633人閱讀

摘要:但是在的高版本語(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

相關(guān)文章

  • 【轉(zhuǎn)】淺談PHP5中垃圾回收算法(Garbage Collection)演化

    摘要:所有這些類(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...

    AdolphLWQ 評(píng)論0 收藏0
  • php內(nèi)核閱讀(2)--淺談 gc回收機(jī)制

    摘要:垃圾回收所謂垃圾就是指通過(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ò))一臉懵逼。 本人小菜,如果下面...

    wemallshop 評(píng)論0 收藏0
  • 談?wù)?PHP類(lèi)型約束

    摘要:但是在以來(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)型約束有了所指,并且在許多流行框...

    libxd 評(píng)論0 收藏0
  • Learning PHP —— 設(shè)計(jì)模式 | Chap1:淺談設(shè)計(jì)模式中OOP

    摘要:而哈士奇區(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.順序編程...

    SunZhaopeng 評(píng)論0 收藏0
  • 淺談創(chuàng)業(yè)公司或新項(xiàng)目如何做技術(shù)選型

    摘要:創(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)遵循以下原則和...

    mrli2016 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<