標量類型聲明
兩種方式:強制方式和嚴格方式
int float bool string array interface callable 7種類型
參數以及返回值的類型現在可以通過在類型前加上一個問號使之允許爲空,當啓用這個特性時,傳入的參數或者函數返回的結果要麼是給定的類型,要麼是 null
//強制模式 會將參數強制轉換爲對應的參數類型
declare(strict_types=1);
function getSum(?int ...$int){
return array_sum($int);
}
$sum = getSum(1,2,3,4.9);
print($sum);
//嚴格模式 如果不符合參數類型則報錯
declare(strict_types=1);
function getSum(int ...$int){
return array_sum($int);
}
$sum = getSum(1,2,3,4);
print($sum);
函數返回值類型
int float bool string array interface callable 7種類型
參數以及返回值的類型現在可以通過在類型前加上一個問號使之允許爲空,當啓用這個特性時,傳入的參數或者函數返回的結果要麼是給定的類型,要麼是 null
一個新的返回值類型void被引入。 返回值聲明爲 void 類型的方法要麼乾脆省去 return 語句,要麼使用一個空的 return 語句。 對於 void 函數來說,NULL 不是一個合法的返回值
//強制模式 會將參數強制轉換爲對應的參數類型
function getSum(int $init):?int
{
return $init + 1.1;
}
$sum = getSum(1);
print($sum);
//嚴格模式 如果不符合參數類型則報錯
declare(strict_types=1);
function getSum(int $init):?int
{
return $init + 1.1;
}
$sum = getSum(1);
print($sum);
function swap(&$left, &$right) : void
{
if ($left === $right) {
return;
}
$tmp = $left;
$left = $right;
$right = $tmp;
}
空合併運算符
$a ?? $b ?? $c 從左往右第一個存在且不爲 NULL 的操作數
$post = $_POST;
// 之前的寫法 $id = isset($post['id']) ? $post['id'] : 0;
$id = $post['id'] ?? 0;
print($id);
太空船運算符
$a <=> a小於、等於、大於$b時 分別返回一個小於、等於、大於0的integer 值
$a = 1 <=> 2;
$b = 4 <=> 3;
$c = 5 <=> 5;
var_dump($a,$b,$c);
常量數組
在 PHP 5 中,define 的 value 必須是標量( integer、 float、string、boolean、NULL)在 PHP 7 中還允許是個 array 的值
define('TMP_NAME',['Tom','Lily','Ben']);
if(defined('TMP_NAME'))
var_dump(TMP_NAME);
匿名類
在php7中,匿名類現在可以使用 new class 來定義。匿名類可以使用來代替完整的類定義
interface Logger {
public function log(string $msg);
}
class Application {
private $logger;
public function getLogger(): Logger {
return $this->logger;
}
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {
print($msg);
}
});
$app->getLogger()->log("My first Log Message");
use 語句
從同一 namespace 導入的類、函數和常量現在可以通過單個 use 語句 一次性導入了
// PHP 7 之前的代碼
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
// PHP 7+ 及更高版本的代碼
use some\namespace\{ClassA, ClassB, ClassC as C};
新增整數除法函數
$a = 10;
$b = 3;
//$c = $a / $b;
$c = intdiv($a,$b);
var_dump($c);
CSPRNG Functions
新加入兩個跨平臺的函數: random_bytes() 和 random_int() 用來產生高安全級別的隨機字符串和隨機整數
$bytes = bin2hex(random_bytes(5));
$int = random_int(100,999);
var_dump($bytes,$int);
短數組語法
短數組語法([])現在作爲list()語法的一個備選項,可以用於將數組的值賦給一些變量(包括在foreach中)
$data = [
[1, 'Tom',29],
[2, 'Fred',35],
];
// list() style
list($id1, $name1,$age) = $data[0];
var_dump($id1,$name1,$age);
echo '<br/>';
// [] style
[$id1, $name1] = $data[0];
var_dump($id1,$name1);
echo '<br/>';
// list() style
foreach ($data as list($id, $name)) {
// logic here with $id and $name
var_dump($id,$name);
}
echo '<br/>';
// [] style
foreach ($data as [$id, ,$age]) {
// logic here with $id and $name
var_dump($id,$age);
}
類常量的可見性
與類屬性的可見性一致
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}