型別約束,即定義乙個變數的時候,必須指定其型別,並且以後該變數也只能儲存該型別資料。
php作為弱型別語言,其特點是無需為變數指定型別,而且在其後也可以儲存任何型別,但是在php的新語法中,在某些特定場合,針對某些特定型別,也可進行語法約束。php 5開始,在物件導向中,為方法帶來了型別約束,php 7完善了對型別限制的支援,補上了之前的短缺,包括標量型別、返回值型別。
php中接近完善的型別約束,降低了**中一些因為型別約束而導致的問題。
演變過程
1. 早期的約束
雖然 php 是隱式轉換,但是在實際開發中也會存在一些無法轉換的窘境,當然這些問題我們在開發階段很容易發現,但是如果是一些動態的內容導致不可控就會呈現在使用者面前,也就是 bug ,在 php 中有一批以 is_* 開頭的方法用來做一些簡單型別判斷。
只支援物件、介面、陣列、函式型別約束
3. php 7+
增加了標量型別、返回值型別、可為空(nullable)型別 (php 7.1)、void函式,在 php 7.1 中還加入了嚴格型別驗證
型別約束的使用
1、標量、物件、介面、陣列、函式型別
1function f(類名 $p){}// 要求引數只能使用該類的物件<?php23
/**4* @param string $name
5* @param int $age
6* @param float $height
7* @param bool $isboy8*/
9function sayinfo(string
$name, int $age, float
$height, bool $isboy)10
1314 sayinfo("小明", 16, "170cm", true
);15
16//
輸出結果
17// 姓名:小明,年齡:16,身高:170,是否為男孩:是
function f(介面名 $p){}// 要求該引數只能使用實現該介面的物件
function f(arrary $p){}// 要求該引數只能使用陣列
function f(callable $p)// 要求該引數只能是乙個函式(方法),此時稱之為**函式(方法)
在專案中的運用如下圖:
說明:
此處要求構造方法中的引數必須是emailsenderby163(郵件傳送類)的物件
2、返回值型別
1)返回值型別,也可指定物件名,則必須返回指定物件的例項
2)如果不做型別強制約束,那麼php會將返回的資料轉化為指定型別的資料再返回,目前差不多只有string無法強轉為int才會報錯。如果指定了強制約束,那麼php將不會進行型別轉換,而是進行對比,如型別不同,則報錯。
1<?php
2declare(strict_types = 1);//
型別強制約束34
class
address510
}1112class
person
1317
public
function b():?int
20public
function age(float
$age) : float
2124
25public
function name(string
$name) : string
2629
30public
function isalive(bool $alive) : ?string
3134
//返回的必須是address類的例項
35public
function getaddress() :address
3639}40
41$person = new
person();
42var_dump($person->getaddress());
php拾遺 型別約束
突然間什麼都不想幹,感覺就像來大姨夫一樣。但是又不能斷了每個工作日都寫部落格的習慣。所以今天水一下吧。php用了快2年了,但是這東西竟然第一次看到,突然間,覺得自己有掉回戰五渣的行列了。翻開官方文件 型別約束 裡面講的非常清楚了。總共就四種 類名,介面,陣列,callable php 5.4起 那些...
PHP7型別約束
在php7之前,函式和類方法不需要宣告變數型別,任何資料都可以被傳遞和返回,導致幾乎大部分的呼叫操作都要判斷返回的資料型別是否合格。為了解決這個問題,php7引入了型別宣告。目前有兩類變數可以宣告型別 形參,返回值。支援的型別有整形,浮點型,字串型,布林型。如下 function study int...
mysql約束 MySQL 約束型別
約束是一種限制,它通過對錶的行或列的資料做出限制,來確保表的資料的完整性 唯一性。mysql中,常用的幾種約束 約束型別 主鍵外來鍵唯一非空自增預設值 關鍵字 primary key foreign key unique not null auto increment default 1 主鍵約束 ...