本文作者:心月

PHP5.6.X 到 PHP7.0.X 的新增特性

心月IT博客 2019-04-10
摘要:1、標量類型聲明標量類型聲明 有兩種模式: 強制 (默認) 和 嚴格模式。 現在可以使用下列類型參數(無論用強制模式還是嚴格模式): 字符串(string), 整數 (int), 浮點數 (float), 以及布爾值 (bool)。

1、標量類型聲明

    標量類型聲明 有兩種模式: 強制 (默認) 和 嚴格模式。 現在可以使用下列類型參數(無論用強制模式還是嚴格模式): 字符串(string), 整數 (int), 浮點數 (float), 以及布爾值 (bool)。

<?php
    function sum(int ...$ints){
	return array_sum($ints);
    }

    echo sum(1,2,3,'4.2',5,'6.7');

在PHP7.0.12中的運行結果

21


2、返回值類型聲明

    PHP 7 增加了對返回類型聲明的支持。 類似于參數類型聲明,返回類型聲明指明了函數返回值的類型。可用的類型與參數聲明中可用的類型相同。

<?php
    function arraysSum(array ...$arrays): array
    {

	    return array_map(function(array $array): int {

	        return array_sum($array);

	    }, $arrays);

    }

    var_dump(arraysSum([1,2,3,4]));

在PHP7.0.12中的運行結果

array(1) { [0]=> int(10) }


3、null合并運算符

    由于日常使用中存在大量同時使用三元表達式和 isset()的情況, 我們添加了null合并運算符 (??) 這個語法糖。如果變量存在且值不為NULL, 它就會返回自身的值,否則返回它的第二個操作數。

<?php

    $username1 = $_GET['user'] ?? 'nobody';

    $username2 = isset($_GET['user']) ? $_GET['user'] : 'nobody';

    $username3 = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

    echo "username1:".$username1.'<br>';
    echo "username2:".$username2.'<br>';
    echo "username3:".$username3.'<br>';

直接在PHP7.0.12中運行上述代碼輸出的結果為:

username1:nobody
username2:nobody
username3:nobody


4、太空船操作符(組合比較符)

    太空船操作符用于比較兩個表達式。當$a小于、等于或大于$b時它分別返回-1、0或1。 比較的原則是沿用 PHP 的常規比較規則進行的。

<?php
    //括號內為太空艙操作符表達式
    // 整數    
    echo "1 <=> '1' : ".(1 <=> '1').'<br>';
    echo "1 <=> 2 : ".(1 <=> 2).'<br>';
    echo "2 <=> 1 : ".(2 <=> 1).'<br>';
    
    // 浮點數
    echo "'1.50' <=> 1.5 : ".('1.50' <=> 1.5).'<br>';
    echo "1.5 <=> 2.5 : ".(1.5 <=> 2.5).'<br>';
    echo "2.5 <=> 1.5 : ".(2.5 <=> 1.5).'<br>'; 

    // 字符串
    echo '"a" <=> "a" : '.("a" <=> "a").'<br>';
    echo '"a" <=> "b" : '.("a" <=> "b").'<br>';
    echo '"b" <=> "a" : '.("b" <=> "a").'<br>';

在PHP7.0.12中運行上述代碼輸出的結果為:

1 <=> '1' : 0
1 <=> 2 : -1
2 <=> 1 : 1
'1.50' <=> 1.5 : 0
1.5 <=> 2.5 : -1
2.5 <=> 1.5 : 1
"a" <=> "a" : 0
"a" <=> "b" : -1
"b" <=> "a" : 1


5、通過 define() 定義常量數組

    Array 類型的常量現在可以通過 define() 來定義。在 PHP5.6 中僅能通過 const 定義。

<?php

    define('ANIMALS',['dog', 'cat', 'fish']);

    echo ANIMALS[2];

在PHP7.0.12中的輸出結果為:

fish


6、Closure::call()

    Closure::call() 現在有著更好的性能,簡短干練的暫時綁定一個方法到對象上閉包并調用它。

<?php

    class A {private $x = 1;}
    
    // PHP 7 之前版本的代碼
    
    $getXCB = function() {return $this->x;};
    
    $getX = $getXCB->bindTo(new A, 'A'); // 中間層閉包
    
    echo $getX().'<br>';
    
    // PHP 7+ 及更高版本的代碼
    
    $getX = function() {return $this->x;};
    
    echo $getX->call(new A);

在PHP7.0.12版本中都可以輸出結果:

1
1

    但在PHP7.0.x以前的版本則只有第一個會輸出結果。

Closure::call()


7、分組 use 聲明

    從同一 namespace 導入的類、函數和常量現在可以通過單個 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};


8、生成器可以返回表達式

    此特性基于 PHP 5.5 版本中引入的生成器特性構建的。 它允許在生成器函數中通過使用 return 語法來返回一個表達式 (但是不允許返回引用值), 可以通過調用 Generator::getReturn() 方法來獲取生成器的返回值, 但是這個方法只能在生成器完成產生工作以后調用一次。


9、intdiv()整數除法

    intdiv() 接收兩個參數,返回值為第一個參數除于第二個參數的值并取整。

<?php

    echo intdiv(6,4).'<br>';
    echo intdiv(8,4).'<br>';
    echo intdiv(9,4).'<br>';

PHP7.0.12 輸出結果:

1
2
2


文章版權及轉載聲明:

作者:心月 本文地址:http://www.rawkpk.live/other/234.html發布于 2019-09-07
文章轉載或復制請以超鏈接形式并注明出處心月IT博客

分享到:
贊(

發表評論

快捷輸入:

    評論列表 (有 0 條評論,人圍觀)參與討論