本篇文章介紹了關於PHP5.5 ~ PHP7.2 新特性整理,有需要的朋友可以參考一下
從PHP 5.5.x 移植到 PHP 5.6.x
新特性
使用運算式定義常量
<?phpconst ONE = 1;const TWO = ONE * 2;class C { const THREE = TWO + 1; const ONE_THIRD = ONE / self::THREE; const SENTENCE = 'The value of THREE is '.self::THREE;}
<?phpconst ARR = ['a', 'b'];echo ARR[0];
使用 ...
運算子定義變長參數函數
<?phpfunction f($req, $opt = null, ...$params) { // $params 是一個包含了剩餘參數的數組 printf('$req: %d; $opt: %d; number of params: %d'."\n", $req, $opt, count($params));}f(1);f(1, 2);f(1, 2, 3);f(1, 2, 3, 4);?>
以上常式會輸出:
$req: 1; $opt: 0; number of params: 0$req: 1; $opt: 2; number of params: 0$req: 1; $opt: 2; number of params: 1$req: 1; $opt: 2; number of params: 2
使用 ...
運算子進行參數展開
<?phpfunction add($a, $b, $c) { return $a + $b + $c;}$operators = [2, 3];echo add(1, ...$operators);?>
以上常式會輸出:
6
use function 以及 use const
<?phpnamespace Name\Space { const FOO = 42; function f() { echo __FUNCTION__."\n"; }}namespace { use const Name\Space\FOO; use function Name\Space\f; echo FOO."\n"; f();}?>
以上常式會輸出:
42Name\Space\f
使用 hash_equals() 比較字串避免時序攻擊
從PHP 5.6.x 移植到 PHP 7.0.x
新特性
標量型別宣告
標量型別宣告 有兩種模式: 強制 (預設) 和 strict 模式。 現在可以使用下列型別參數(無論用強制模式還是strict 模式): 字串(string), 整數 (int), 浮點數 (float), 以及布爾值 (bool)。
<?php// Coercive modefunction sumOfInts(int ...$ints){ return array_sum($ints);}var_dump(sumOfInts(2, '3', 4.1));
以上常式會輸出:
int(9)
傳回值型別宣告
<?phpfunction arraysSum(array ...$arrays): array{ return array_map(function(array $array): int { return array_sum($array); }, $arrays);}
null合并運算子
<?php// Fetches the value of $_GET['user'] and returns 'nobody' if it does not exist.$username = $_GET['user'] ?? 'nobody';// This is equivalent to:$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';// Coalesces can be chained: this will return the first defined value out of $_GET['user'], $_POST['user'], and 'nobody'.$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';?>
太空船操作符(組合比較符)
<?php// 整數echo 1 <=> '1'; // 0echo 1 <=> 2; // -1echo 2 <=> 1; // 1// 浮點數echo '1.50' <=> 1.5; // 0echo 1.5 <=> 2.5; // -1echo 2.5 <=> 1.5; // 1 // 字串echo "a" <=> "a"; // 0echo "a" <=> "b"; // -1echo "b" <=> "a"; // 1?>
通過 define() 定義常量數組
define('ANIMALS', [ 'dog', 'cat', 'bird']);echo ANIMALS[1]; // 輸出 "cat"
Closure::call()
<?phpclass A {private $x = 1;}// PHP 7 之前版本的代碼$getXCB = function() {return $this->x;};$getX = $getXCB->bindTo(new A, 'A'); // 中介層閉包echo $getX();// PHP 7+ 及更高版本的代碼$getX = function() {return $this->x;};echo $getX->call(new A);
以上常式會輸出:
1
分組 use
聲明
<?php// PHP 7 之前的代碼use some\namespace\ClassA;use some\namespace\ClassB;use some\namespace\ClassC as C;use function some\namespace\fn_a;use function some\namespace\fn_b;use function some\namespace\fn_c;use const some\namespace\ConstA;use const some\namespace\ConstB;use const some\namespace\ConstC;// PHP 7+ 及更高版本的代碼use some\namespace\{ClassA, ClassB, ClassC as C};use function some\namespace\{fn_a, fn_b, fn_c};use const some\namespace\{ConstA, ConstB, ConstC};?>
產生器可以返回運算式
整數除法函數 intp()
從PHP 7.0.x 移植到 PHP 7.1.x
新特性
可為空白(Nullable)類型
<?phpfunction testReturn(): ?string{ return 'elePHPant';}var_dump(testReturn());function testReturn(): ?string{ return null;}var_dump(testReturn());function test(?string $name){ var_dump($name);}test('elePHPant');test(null);test();
以上常式會輸出:
string(10) "elePHPant"NULLstring(10) "elePHPant"NULLUncaught Error: Too few arguments to function test(), 0 passed in...
Void 函數
<?phpfunction swap(&$left, &$right) : void{ if ($left === $right) { return; } $tmp = $left; $left = $right; $right = $tmp;}$a = 1;$b = 2;var_dump(swap($a, $b), $a, $b);
以上常式會輸出:
nullint(2)int(1)
Symmetric array destructuring
<?php$data = [ [1, 'Tom'], [2, 'Fred'],];// list() stylelist($id1, $name1) = $data[0];// [] style[$id1, $name1] = $data[0];// list() styleforeach ($data as list($id, $name)) { // logic here with $id and $name}// [] styleforeach ($data as [$id, $name]) { // logic here with $id and $name}
類常量可見度
<?phpclass ConstDemo{ const PUBLIC_CONST_A = 1; public const PUBLIC_CONST_B = 2; protected const PROTECTED_CONST = 3; private const PRIVATE_CONST = 4;}
iterable 偽類
<?phpfunction iterator(iterable $iter) : iterable{ foreach ($iter as $val) { // }}
多異常捕獲處理
<?phptry { // some code} catch (FirstException | SecondException $e) { // handle first and second exceptions}
list()
現在支援鍵名
<?php$data = [ ["id" => 1, "name" => 'Tom'], ["id" => 2, "name" => 'Fred'],];// list() stylelist("id" => $id1, "name" => $name1) = $data[0];// [] style["id" => $id1, "name" => $name1] = $data[0];// list() styleforeach ($data as list("id" => $id, "name" => $name)) { // logic here with $id and $name}// [] styleforeach ($data as ["id" => $id, "name" => $name]) { // logic here with $id and $name}
從PHP 7.1.x 移植到 PHP 7.2.x
新特性
新的物件類型
<?phpfunction test(object $obj) : object{ return new SplQueue();}test(new StdClass());
允許重寫抽象方法(Abstract method)
abstract class A{ abstract function test(string $s);}abstract class B extends A{ // overridden - still maintaining contravariance for parameters and covariance for return abstract function test($s) : int;}
擴充了參數類型
interface A{ public function Test(array $input);}class B implements A{ public function Test($input){} // type omitted for $input}
允許分組命名空間的尾部逗號
use Foo\Bar\{ Foo, Bar, Baz,};