類屬性從PHP 7.4開始提供,允許在類的屬性添加類型。支持可用的類型
bool
int
float
string
array
iterable
object
? (nullable)
self & parent
Classes & interfaces
屬性類型對(duì)于業(yè)務(wù)非常友好,因?yàn)橐粋€(gè)好的封裝,通常屬性只會(huì)用到一種類型,例如封裝一個(gè)人:
class people
{
public string $name;
public int $age;
}
對(duì)于$people->name 人的名稱,只能是字符串,年齡 age 只能是數(shù)字,無論業(yè)務(wù)怎么變化,他們的類型是不需要也不允許變化的。
未初始化
$people = new people();
var_dump($people->name);
如果屬性添加了類型,但是使用的前沒有賦值,php會(huì)直接報(bào)錯(cuò);如果name不是一個(gè)必要初始的參數(shù),類型可以改為:?string,這樣使用就不會(huì)報(bào)錯(cuò)
Fatal error: Uncaught Error: Typed property people::$name must not be accessed before initialization in ……
如果 name 沒聲明類型,那么 $people->name = nill,如果未初始化,需要判斷是否初始化,可以使用 isset() 函數(shù)
$people = new people();
var_dump(isset($people->name)); // false
類型約束和自動(dòng)轉(zhuǎn)換
查看聲明類型的屬性,當(dāng)賦值多種類型值時(shí),會(huì)怎么變化
$people = new people();
echo "<br>";
$people->name = "張三";
$people->age = 123;
var_dump($people);
echo "<br>";
$people->name = true;
$people->age = true;
var_dump($people);
echo "<br>";
$people->name = 123;
$people->age = "字符串";
var_dump($people);
echo "<br>";
輸出
object(people)#1 (2) { ["name"]=> string(6) "張三" ["age"]=> int(123) }
object(people)#1 (2) { ["name"]=> string(1) "1" ["age"]=> int(1) }
Fatal error: Uncaught TypeError: Typed property people::$age must be int, string used in
顯然,在賦值其他不同類型值時(shí)候,php會(huì)在寫入時(shí)會(huì)進(jìn)行類型驗(yàn)證,并且在不丟失精度下自動(dòng)完成。
而 string=>int會(huì)直接報(bào)錯(cuò),可見不是簡(jiǎn)單 (int)$string 強(qiáng)制轉(zhuǎn)換,像復(fù)合數(shù)據(jù)類型、特殊數(shù)據(jù)類型都是不可以轉(zhuǎn)換的
能自動(dòng)轉(zhuǎn)換不會(huì)報(bào)錯(cuò)的類型(標(biāo)量數(shù)據(jù)類型)
boolean => int
boolean => float
boolean => string
int => boolean
int => float
int => string
float => int
float => string
float => boolean
string => boolean
禁用轉(zhuǎn)換
如果不需要自動(dòng)轉(zhuǎn)換,可以通過聲明嚴(yán)格類型,禁用轉(zhuǎn)換
declare(strict_types=1);