PHP7.4特征測(cè)試-類屬性

類屬性從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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容