PHP7——及以上版本新特性簡析

PHP-8

指定參數(shù)類型(7以前就有)、可變參數(shù)個數(shù)、返回類型:

// ** 平方計算;
// ...$barr,不固定的可變參數(shù)個數(shù);
// : array 強(qiáng)制返回數(shù)組類型
function new7feature(int $a, $b, ...$barr): array {
    $a = $a**2; //平方計算
    $b = $b??1; // 空結(jié)合操作符,null合并操作符
    $c = 1;
    if (($b<=>1) > 0)  // 太空船操作符
    {
        $c = 11;
    }
    return array(
        $a,$b,$c,array_sum($barr)
    );
}
print_r(new7feature(3,3,5,7));die;

參數(shù)類型約束

以前版本的PHP,函數(shù)和類方法不需要聲明變量類型,任何數(shù)據(jù)都可以被傳遞和返回,這導(dǎo)致幾乎大部分的調(diào)用操作都要判斷返回的數(shù)據(jù)類型是否合格。
為了解決這個問題,PHP7引入了類型聲明(其實7以前就有)。

目前有兩類變量可以聲明類型: 形參,返回值;
支持的類型有整形,浮點型,字符串型,布爾型;

strict_types:強(qiáng)制校驗 參數(shù)OR返回值類型

strict_types 是 PHP 7 引入的一個新特性,通過 declare 設(shè)定,默認(rèn)不開啟,指令 declare (strict _ types =1); 表示開啟,此時在調(diào)用函數(shù)時,會驗證參數(shù)和返回值的類型和函數(shù)定義的類型是否完全一致,如果不一致將報錯。
沒有開啟 strict_types 時,標(biāo)量類型可能會限制內(nèi)部隱式類型轉(zhuǎn)化。 如果值的類型不是聯(lián)合類型中的一部分,則目標(biāo)類型會按以下順序:

int
float
string
bool

如果類型出現(xiàn)在組合中,值可以按 PHP 現(xiàn)有的類型語義檢測進(jìn)行內(nèi)部隱式強(qiáng)制轉(zhuǎn)化,則會選擇該類型。 否則會嘗試下一個類型。

declare(strict_types = 1); // 此定義需在首行
//如果不做類型強(qiáng)制約束,PHP會將返回值轉(zhuǎn)化為指定類型的數(shù)據(jù)再返回,如下示例,str會被轉(zhuǎn)為int返回;
//如果指定了強(qiáng)制約束,PHP將不會進(jìn)行類型轉(zhuǎn)換,而是對比類型,若類型不同,則報 fatal error。
function bool2num(bool $a) : int
{ //形參的括號后面加冒號加類型即可指定方法返回值的類型,指定了什么類型返回的就是什么類型。
    return (int)$a;
}
var_dump(bool2num(true));

返回值類型,也可指定對象(比如 class),

此時,則必須返回指定對象的實例,如:

class Animal {
    private static $me=null;
    private $name='';
    private function __construct($name) {
        $this->name = $name;
    }
    public function getAnimalName() {
        return $this->name;
    }
    public static function getinstance(string $name) : Animal
    {
        if(self::$me != null) {
            return self::$me;
        }
        self::$me = new self($name);
        return self::$me;
    }
}
$tcase = Animal::getinstance('fox');
var_dump($tcase->getAnimalName());

如果不返回 Animal 類型,則會報fatal error。

允許兼容 null 類型

1、參數(shù)聲明可同時兼容 null 類型

class C {}
function f(?C $c) {
    var_dump($c);
}
f(new C);
f(null);
//以上示例在參數(shù)傳入 null 時不會報錯,而是輸出 `null`

2、返回值可同時兼容 null 類型

function get_item(): ?string {
    if (isset($_GET['item'])) {
        return $_GET['item'];
    } else {
        return null;
    }
}

注: 其實可通過設(shè)置參數(shù)默認(rèn)值為 null 來變相實現(xiàn)允許為空的參數(shù),但不建議如此做,會影響到類的繼承調(diào)用。

class C { 
    public $show = 'c';
}
function f(C $c = null) {
    var_dump($c->show);
}
f(null);

如上示例,就會報notice,如果開啟強(qiáng)制校驗則會報fatal;

關(guān)于 PHP8 的一些新特性

聯(lián)合類型 RFC
聯(lián)合類型是兩個或者多個類型的集合,表示可以使用其中任何一個類型。

public function foo(Foo|Bar $input): int|float;

請注意,聯(lián)合類型中不包含 void,因為 void 表示的含義是 “根本沒有返回值”。 另外,可以使用 |null 或者現(xiàn)有的 ? 表示法來表示包含 nullable 的聯(lián)合體 :

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

php官網(wǎng)鏈接參考:https://www.php.net/manual/zh/language.types.declarations.php
To Be Continued...

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

相關(guān)閱讀更多精彩內(nèi)容

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