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...