PHP7中有哪些特性

零下一度
發布: 2023-03-10 17:20:02
原創
1103 人瀏覽過

類型宣告

看程式碼,一目了然了。

class person
{
    public function age(int $age) : string
    {
        return 'Age is ' . $age;
    }
}
登入後複製

命名空間與use關鍵字批次宣告

非混合模式

use Publishers\Packt\{ Book, Ebook, Video};
use function Publishers\Packt\{ getBook, saveBook };
use const Publishers\Packt\{ COUNT, KEY };
登入後複製

混合模式

use Publishers\Packt\{
    Book,
    Ebook,
    Video,
    function getBook,
    function saveBook,
    const COUNT,
    const KEY
};
登入後複製

複合模式

use Publishers\Packt\{
    Paper\Book,
    Electronic\Ebook,
    Media\Video
};
登入後複製

匿名類別

匿名類別的宣告與使用時同時進行的,具備其他類別所具備的所以功能,差別在於匿名類別沒有類別名稱。語法如下:

new class(argument) { definition };
登入後複製

匿名類別是沒有類別名稱的,但在PHP內部,會在記憶體的參考位址表中為其分配一個全域唯一的名稱。

$name = new class('You') {
    public function __construct($name)
    {
        echo $name;
    }
};
登入後複製

匿名類別可以繼承父類別及父類別的方法。

class Packt
{
    protected $number;

    public function __construct()
    {
        echo 'parent construct';
    }

    public function getNumber() : float
    {
        return $this->number;
    }
}

$number = new class(5) extends Packt
{
    public function __construct(float $number)
    {
        parent::__construct();
        $this->number = $number;
    }
};

echo $number->getNumber();
登入後複製

匿名類別可以繼承介面。

interface Publishers
{
    public function __construct(string name, string address);
    public function getName();
    public function getAddress();
}

class packt
{
    protected $number;
    protected $name;
    protected $address;
    public function ...
}

$info = new class('name', 'address') extends Packt implement Publishers
{
    public function __construct(string $name, string $address)
    {
        $this->name = $name;
        $this->address = $address;
    }

    public function getName() : string
    {
        return $this->name;
    }

    public function getAddress() : string
    {
        return $this->address;
    }
}

echo $info->getName() . ' ' . $info->getAddress();
登入後複製

匿名類別可以嵌套在一個類別中使用。

class Math
{
    public $first_number = 10;
    public $second_number = 10;
    public function add() : float
    {
        return $this->first_number + $this->second_number;
    }

    public function mutiply_sum()
    {
        return new class() extends Math
        {
            public function mutiply(float $third_number) : float
            {
                return $this->add() * $third_number;
            }
        };
    }
}

$math = new Math();
echo $math->mutiply_sum()->mutiply(2);
登入後複製

摒棄老式建構函數

從PHP4開始,建構子可以透過命名與類​​別名稱一致的方式來宣告自己是建構函數,在PHP7中這種方式宣告建構子依然可以使用,但不建議使用,會輸出不推薦的資訊Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Packt has a deprecated constructor in ..., PHP7中推薦使用__construct()

throwable介面

從PHP7開始,程式中的fatal錯誤都可以被截獲,PHP7提供了throwable接口,異常與錯誤都繼承於這個接口。

Error

現在大多數的fatal錯誤情況會拋出一個error實例,類似於截獲異常,error實例可以被try/catch截獲。

try
{
    ...
} catch(Error $e)
{
    echo $e->getMessage();
}
登入後複製

有些錯誤狀況只有error的子實例會被拋出,例如 TypeError、DivisionByZeroError、ParseError等。

<=>運算子

<=>運算子將​​==< >三個比較運算子打包在了一起,具體使用規則如下。

運算子兩邊相等時回傳0
運算子左邊小於右邊時回傳-1
運算子左邊大於右邊時回傳1

null合併運算子

?? 合併運算符,在第一運算元存在時可直接傳回,否則傳回第二運算元。

$title = $post['title'] ?? NULL;

$title = $post['title'] ?? $get['title'] ?? 'No title';
登入後複製

uniform變數語法

$first = ['name' => 'second'];
$second = 'two';
echo $$first['name'];
echo ${Sfirst['name']}; // PHP7

...
echo $object->$methods['title'];
echo $object->{$methods['title']}; // PHP7
登入後複製

主要是因為PHP7與先前版本PHP的解析方式不一樣,在PHP7中加上花括號就可以啦,就像上邊程式碼這樣,否則會報錯誤。

常數數組

從PHP5.6開始常數數組可以用const關鍵字來聲明,在PHP7中常數數組可以透過define函數來初始化。

const STORES = ['en', 'fr', 'ar']; // php5.6
define('STORES', ['en', 'fr', 'ar']); // php7
登入後複製

switch中的default預設值

在PHP7之前,switch語句中允許多個default預設值,從PHP7開始,只能有一個default預設值,否則會產生fatal級別錯誤。

// php7之前
switch (true) {
    case 'value':
        # code...
        break;
    default:
        # code...
        break;
    default:
        # code...
        break;
}

// php7
switch (true) {
    case 'value':
        # code...
        break;
    default:
        # code...
        break;
}
登入後複製

session_start函數中的選項陣列

在PHP7之前,使用session的時候都必須先呼叫session_start()函數,而這個函數並沒有參數需要傳遞,所有session相關的配置都在php.ini檔案中,從PHP7開始,可以在呼叫這個函數時傳遞參數選項數組,這些設定資訊將會覆蓋php.ini中的session配置。

session_start([
    'cookie_lifetime' => 3600,
    'read_and_close' => true
]);
登入後複製

unserialize函數引入過濾器

unserialize()可以反序列化任何類型的對象,沒有任何過濾項,不安全,PHP7在unserialize()中引入了過濾器,且預設允許反序列化所有類型的物件。

$result = unserialize($object, ['allowed_classes' => ['Book', 'Ebook']]);
登入後複製

以上是PHP7中有哪些特性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!