php7類型約束的意義

PHP7之前,函數和類方法不需要聲明變量類型,任何數據都可以被傳遞和返回,導致幾乎大部分的調用操作都要判斷返回的數據類型是否合格。

爲了解決這個問題,PHP7引入了類型聲明。

目前有兩類變量可以聲明類型: 形參,返回值。

支持的類型有整形,浮點型,字符串型,布爾型。

如下代碼:

<?php
function study(int $get)
{
    return $get;
}
var_dump(study('ddd'));

爲了節省代碼篇幅,爲就不寫OOP了,直接以函數爲例。

此函數指定了參數類型爲int, 而調用的時候傳入'ddd'字符串,因此此代碼運行會產生Fatal error錯誤。

而有些情況,PHP總是不那麼認真,如下:

<?php
function study(bool $get)
{
    return $get;
}
var_dump(study('ddd'));

指定參數類型爲bool,但是傳入的字符串被轉化成了true,運行後輸出的結果爲:bool(true)

如要強制性約束類型,可在文件頭部添加declare聲明:

<?php
declare(strict_types = 1);
function study(bool $get)
{
    return $get;
}
var_dump(study('ddd'));

此時也會產生一個致命錯誤,因爲指定的參數類型爲bool但是傳入的參數類型爲string,只有把'ddd'換成true和false纔可以,哪怕是1或0都不行。

接下來介紹一下返回類型聲明:

<?php
declare(strict_types = 1);
function study(bool $get) : int
{
    return (int)$get;
}
var_dump(study(true));

形參的括號後面加冒號加類型即可指定方法返回值的類型,指定了什麼類型返回的就是什麼類型。

同樣受declare影響,

如果不做類型強制約束,那麼PHP會將返回的數據轉化爲指定類型的數據再返回,目前差不多隻有string無法強轉爲int纔會報錯。

如果指定了強制約束,那麼PHP將不會進行類型轉換,而是進行對比,如類型不同,則報錯。

還有,返回值類型,也可指定對象名,則必須返回指定對象的實例,如:

<?php
declare(strict_types=1);

class A
{
    private function __construct($name)
    {
        $this->name = $name;
    }

    static function instance(string $name): A
    {
        return new self($name);
    }
}
var_dump(A::instance('jackie'));

以上內容希望幫助到大家, 很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提升,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨需要的可以免費分享給大家 ,需要戳這裏     PHP進階架構師>>>實戰視頻、大廠面試文檔免費獲取     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章