首頁  >  文章  >  後端開發  >  PHP7.x中各版本的新功能有哪些?

PHP7.x中各版本的新功能有哪些?

醉折花枝作酒筹
醉折花枝作酒筹轉載
2021-06-07 09:24:261915瀏覽

這篇文章跟大家介紹一下PHP7.x中各個版本的新特性。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

PHP7.x中各版本的新功能有哪些?

前言

上個月同事看見我寫

$a = $a ?? '';

問我這個寫法是什麼,還有這樣的寫法?我說這是PHP7以上才有的寫法,你不知道嗎?他說不知道。

心裡嘀咕了一下,打算開始寫這篇部落格。

PHP7 應該是除了基礎之外,是一種現在的 PHP 。因為在PHP7 出現了,強型別定義,和一些語法上的寫法,如 組合比較符, define() 可以定義數組等一些特性。以下開始正式介紹,從PHP7.0 開始介紹,之後又出了新版本,也會在下面陸陸續續加上。

好了,我們開始

PHP 7.0

標量類型宣告

什麼是標量型別?

四種標量類型:

boolean (布林型)

integer (整數型)

float (浮點型, 也稱作double)

string(字串)

兩種複合型別:

array (陣列)

object (物件)

資源是一種特殊變量,保存了到外部資源的一個參考。資源是透過專門的函數來建立和使用的。資源類型變數為開啟檔案、資料庫連線、圖形畫布區域等的特殊句柄。

說的通俗一點,標量類型,就是定義變數的一個資料型態。

在php5中,有類別名,接口,陣列 和回呼函數。在php中,增加了 符字串(string), 整數 (int), 浮點數 (float), 以及布林值 (bool)。下面我們來舉例子,萬事萬物看例子

function typeInt(int $a)
{
    echo $a;
}

typeInt('sad');
// 运行,他讲会报错 Fatal error: Uncaught TypeError: Argument 1 passed to type() must be of the type integer, string given

在這裡,我們定義了$a 必須為int類型,如果 type 函數裡面傳了string 所以報錯。讓我們修改上述的程式碼就沒錯了

function typeString(string $a)
{
    echo $a;
}

typeString('sad'); 
//sad

傳回值型別宣告

關於函數的方法回傳值可以定義,例如我某個函數必須要傳回int 類型,他就定死來返回int ,如果你回傳string 則報錯。如下

<?php

function returnArray(): array
{

    return [1, 2, 3, 4];
}

print_r(returnArray());
/*Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)
*/

那當我們的定義了數組,回傳了string或其他型別呢?

那麼他將會報錯例如

function returnErrorArray(): array
{

    return &#39;1456546&#39;;
}

print_r(returnErrorArray());
/*
Array
Fatal error: Uncaught TypeError: Return value of returnArray() must be of the type array, string returned in 
*/

null 合併運算子

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

<?php

$username = $_GET[&#39;user&#39;] ?? &#39;nobody&#39;;
//这两个是等效的  当不存在user 则返回?? 后面的参数

$username = isset($_GET[&#39;user&#39;]) ? $_GET[&#39;user&#39;] : &#39;nobody&#39;;

?>

太空船操作符

// 整数
echo 1 <=> 1; // 0 当左边等于右边的时候,返回0
echo 1 <=> 2; // -1  当左边小于右边,返回-1
echo 2 <=> 1; // 1  当左边大于右边,返回1

// 浮点数
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
 
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

define 定義數組

在PHP7 以前的版本define 是不能夠定義數組的現在是可以的例如

define(&#39;ANIMALS&#39;, [
    &#39;dog&#39;,
    &#39;cat&#39;,
    &#39;bird&#39;
]);

echo ANIMALS[1]; // 输出 "cat"

use 方法批次匯入

// 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};

Unicode codepoint 轉譯語法

echo "\u{aa}"; //ª
echo "\u{0000aa}";  //ª  
echo "\u{9999}"; //香

匿名類別

<?php
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) {
        echo $msg;
    }
});

PHP 7.1

#可為空白類型

參數以及傳回值的類型現在可以透過在類型前加上一個問號來使之允許為空。當啟用這個特性時,傳入的參數或函數傳回的結果要不是給定的類型,就是 null 。

<?php

function testReturn(): ?string
{
    return &#39;elePHPant&#39;;
}

var_dump(testReturn()); //string(10) "elePHPant"

function testReturn(): ?string
{
    return null;
}

var_dump(testReturn()); //NULL

function test(?string $name)
{
    var_dump($name);
}

test(&#39;elePHPant&#39;); //string(10) "elePHPant"
test(null); //NULL
test(); //Uncaught Error: Too few arguments to function test(), 0 passed in...

void

增加了一個返回void的類型,例如

<?php
function 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);

多重異常捕獲處理

這個功能還是比較常用的,在日常開發之中

<?php
try {
    // some code
} catch (FirstException | SecondException $e) {  //用 | 来捕获FirstException异常,或者SecondException 异常
  
}

PHP 7.2

PHP7.2是PHP7系列最少的新特性了

允許分組命名空間的尾部逗號

例如

<?php

use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};

允許重寫抽象方法

<?php

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;
}

新的物件類型

<?php

function test(object $obj) : object  //这里 可以输入对象
{
    return new SplQueue();
}

test(new StdClass());

PHP 7.3

PHP7.3 在語法層面沒有什麼很大的改變。

PHP 7.4

類別屬性支援類型宣告

恭喜PHP 往強類型又邁了一步

<?php
class User {
    public int $id;
    public string $name;
}
?>

箭頭函數

#箭頭函數提供了用於使用隱式按值作用域綁定定義函數的簡寫語法。與 JS 的箭頭函數差不多,不過要帶個 fn。吐槽一波

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>

Null 合併運算子支援方法

<?php
$array[&#39;key&#39;] ??= computeDefault();
// 类似与这个
if (!isset($array[&#39;key&#39;])) {
    $array[&#39;key&#39;] = computeDefault();
}
?>
#推薦學習:

php影片教學######

以上是PHP7.x中各版本的新功能有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除