中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php7所有版本新特征是怎樣的

發布時間:2021-09-24 09:36:33 來源:億速云 閱讀:91 作者:柒染 欄目:編程語言

php7所有版本新特征是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

PHP7.1新特性

1. 可為空(Nullable)類型

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

#php5
function($a = null){
  if($a===null) {
    return null;
  }
  return $a;
}

#php7+
function fun() :?string
{
  return null;
}

function fun1(?$a)
{
  var_dump($a);
}
fun1(null);//null
fun1('1');//1
2. void 類型

返回值聲明為 void 類型的方法要么干脆省去 return 語句。對于 void來說,NULL 不是一個合法的返回值。

function fun() :void
{
  echo "hello world";
}
3. 類常量可見性
class Something
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}
4. iterable 偽類

這可以被用在參數或者返回值類型中,它代表接受數組或者實現了Traversable接口的對象.

function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}
5. 多異常捕獲處理

一個catch語句塊現在可以通過管道字符(_|_)來實現多個異常的捕獲。 這對于需要同時處理來自不同類的不同異常時很有用

try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}
6. list支持鍵名
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// list() style
list("id" => $id1, "name" => $name1) = $data[0];
var_dump($id1);//1
7. 字符串支持負向
$a= "hello";
$a[-2];//l
8. 將callback 轉閉包

Closure新增了一個靜態方法,用于將callable快速地 轉為一個Closure 對象。

<?php
class Test
{
    public function exposeFunction()
    {
        return Closure::fromCallable([$this, 'privateFunction']);
    }

    private function privateFunction($param)
    {
        var_dump($param);
    }
}

$privFunc = (new Test)->exposeFunction();
$privFunc('some value');
9. http2 服務推送

對http2服務器推送的支持現在已經被加入到 CURL 擴展

原文鏈接:https://cloud.tencent.com/dev...

PHP7.2新特性

新的對象類型

這種新的對象類型,object, 引進了可用于逆變(contravariant)參數輸入和協變(covariant)返回任何對象類型。

<?php

function test(object $obj) : object
{
    return new SqlQueue();
}

test(new Stdclass());

允許重寫抽象方法(Abstract method)

當一個抽象類繼承于另外一個抽象類的時候,繼承后的抽象類可以重寫被繼承的抽象類的抽象方法。

<?php

abstract class A
{
    abstract function test(string $s);
}

abstract class B extends A
{
    abstract function test($s) : int;
}

使用Argon2算法生成密碼散列

Argon2 已經被加入到密碼散列(password hashing) API (這些函數以 password_ 開頭), 以下是暴露出來的常量:

  • PASSWORD_ARGON2I

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST

  • PASSWORD_ARGON2_DEFAULT_TIME_COST

  • PASSWORD_ARGON2_DEFAULT_THERADS

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

命名空間可以在PHP 7中使用尾隨逗號進行分組引入。

<?php

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

PHP7.3新特性

1 發布時間

06 Dec 2018

官網PHP7.3新特性

2 更靈活的HeredocNowdoc語法

結束標記不再需要獨立一行或緊跟分號了。同時結束標記也可以使用縮進,使用縮進時doc內容的每行都會跳過相應的縮進。

$data = ["元素", <<<STR
    Doc Content
    The new line
    STR, 42,];
var_dump($data);

array(3) {
  [0]=>
  string(6) "元素"
  [1]=>
  string(25) "Doc Content
The new line"
  [2]=>
  int(42)
}

以上語法中,Heredoc 作為一個數組元素出現,同時結束標記沒有獨立在一行,還有縮進。注意定義的字符串內容,兩行的縮進都被剝除了。

3 數組析構支持引用賦值

演示:

$v = [10, 20];
[$a, &$b] = $v;
$b += 10;
var_dump($v, $a, $b);

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

在為 $b 解析時,使用了引用傳遞,此時 $b 和 $v[1] 元素保持引用關系。

4 list結構支持引用解析。

演示:

$v = [10, 20];
list($c, &$d) = $v;
$d += 10;
var_dump($v, $c, $d);

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

5 instanceof 運算符支持字面量語法

instanceof 的第一個運算數支持字面量,非對象型字面量檢測的結果為 false。

var_dump("literal" instanceof stdClass);
var_dump(42 instanceof stdClass);
var_dump(new stdClass() instanceof stdClass);

bool(false)
bool(false)
bool(true)

6 支持調用時參數的尾隨逗號

調用函數時,參數列表后允許跟隨一個逗號。

function methodName($p1, $p2)
{
    // some statmenet
    var_dump($p1, $p2);
}
methodName(10, 20, );

int(10)
int(20)

調用函數時,第二個(最后一個)參數后,增加了一個逗號是允許的。但定義是不行。

7 BC 數學函數

bcscale()函數支持獲取當前BC函數所使用的 scale。

bcscale(3);
var_dump(bcscale());

int(3)

8 LDAP 全支持

LDAP:Lightweight Directory Access Protocol,輕量目錄訪問協議完全支持。

9 多字節字符串函數更新

  • 全功能的 Case-Mapping 和 Case-Folding 支持

  • 大小寫不敏感字符串運算符使用 Case-Folding

  • 支持 Unicode 11

  • 長字符串支持

  • 命名捕獲支持

10 FastCGI 進程管理

增加了如下的選項來配置FPM的Logging:(暫未翻譯)

  • log_limit

  • log_buffering

  • decorate_workers_output

11 Argon2id 算法支持

--with-password-argon2[=dir] 配置參數后。提供了對Password_*()函數中的 Argon2i 和 Argon2id 散列的支持。使用 PASSWORD_ARGON2ID 常量進行指定算法。PHP需要 libargon2 庫版本要大于(等于)20161029。

12 CompileError 異常替代了一些編譯錯誤

新的 CompileError 異常被添加,ParseError繼承了這個異常。目前只會影響 Token_GET_All() 在 Token_parse 模式下可能引發的編譯錯誤。

13 性能提升

據說 PHP7.3 比 PHP 7.0 快 22%。未測試,有機會壓測一下。

14 廢棄大小寫不敏感的常量

大小寫不敏感的常量聲明現已被廢棄。將 TRUE 作為第三個參數傳遞給 define() 會導致一個廢棄警告。大小寫不敏感的使用(在讀取時使用一個與聲明時不同的大小寫方式)也已被廢棄。

15 廢棄在字符串中搜索非字符串內容

將一個非字符串內容傳遞給字符串搜索函數。 在將來所有待搜索的內容都將被視為字符串,而不是 ASCII 編碼值。如果需要依賴這個特性,你應該 要么顯示地進行類型轉換(轉為字符串),或者顯示地調用 chr()。 以下是受到影響的方法:

16 新常量

新常量

原文鏈接:https://zhuanlan.zhihu.com/p/...

PHP7.4新特性

1、預加載

預加載功能是指在服務啟動時,未運行任何應用程序代碼之前,將一組PHP文件加載到內存中,甚至可以對框架進行預加載,以提高性能。如果對預加載代碼進行修改,需要重啟服務。

預加載相比opcache:opcache雖然解決了重復編譯問題,但opcache本身也有開銷。引用Dmitry Stogov大佬的話:

Not only. The idea is to completely eliminate compilation and opcache overhead (copying from SHM to process memory and insertions into function/class tables on each request). Using this technique, we might write standard functions and classes in PHP (similar to systemlib.php in HHVM).  
預加載是完全消除編譯和opcache所帶來的開銷(從共享內存復制到進程內存,并在每個請求上插入到function/class表中),使用這種技術可以在PHP中編寫標準函數和類(類似于HHVM中的systemlib.php)

想想看,其實預加載主要是提升像php-fpm這種架構形式的性能,并且會占用更多的內存資源。Benjamin Morel對預加載進行了測試。

https://github.com/composer/composer/issues/7777#issuecomment-440268416

使用方法:

通過修改php.ini中的opcache.preload來選擇預加載程序。使用方法如下:

php.ini

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.preload=preload.php

preload.php

<?php 

function preload()
{
    echo 'preload';
}

opcache_compile_file('hello.php');

hello.php

<?php 

function hello()
{
    echo 'hello';
}

test.php

<?php

hello();
echo ' ';
preload();
echo PHP_EOL;

運行

~$ php test.php
hello preload

2、FFI

有時間我們再聊,先占上位置。

3、類屬性的類型支持

php版本<7.4:

<?php

class User
{
    /** @var int $id */
    private $id;

    /** @var string $name */
    public $name;
}

php版本>=7.4:

<?php

class User
{
    private int $id;

    public string $name;
}

一個完整的示例:

<?php

class Example {
    // 支持除了“void”和“callable”之外的所有類型
    public int $scalarType;
    protected ClassName $classType;
    private ?ClassName $nullableClassType;
 
    // 在靜態屬性中也是合法的
    public static iterable $staticProp;
 
    // 也可以與“var”一起使用
    var bool $flag;
 
    // 也可以使用默認值
    public string $str = "foo";
    public ?string $nullableStr = null;
 
    // 在一次聲明多個屬性的情況下,類型會作用于各屬性。
    public float $x, $y;
    // 相當于這樣:
    public float $x;
    public float $y;
}

以下是支持的所有類型:

bool, int, float, string, array, object
iterable
self, parent
class interface // 任何 類名、接口名
?type // 其中“type”可以是以上任意一種類型

4、NULL合并賦值運算符

寫法:$a ??= 1 。其實就是 $a = $a ?? 1 的語法糖。

例子:

<?php

$arr['a'] ??= 'a';
/*等同于*/ $arr['a'] = $arr['a'] ?? 'a'; 

$b ??= 'b'; 
/*等同于*/ $b = $b ?? 'b';

5、棄用WDDX擴展

我相信大多數人和我一樣并不了解wddx,wddx是一個很“古老”的數據格式,基于xml(emmm,可能我理解的不是很對,大概其就是這個意思吧)。現在都在用json,所以棄用了也罷。有興趣的童鞋可以看一下這篇文章。

https://blog.csdn.net/guoguo1980/article/details/2436342

6、簡化匿名函數

此特性就是一個語法糖,相信你在別的語言中也見到過,下面是一些例子:

<?php

$adder = fn($x, $y) => $x + $y;

// 等同于

$adder = function ($x, $y) {
    return $x + $y;
};

/*******************************/

$y = 1;
$fn1 = function ($x) use ($y) {
    return $x + $y;
}; 

// 等同于

$fn2 = fn($x) => $x + $y;

// 新的寫法省去了 use, 變得更加簡潔

更多用法:

<?php

fn(array $x) => $x;          // 參數類型聲明
fn(): int => $x;             // 返回類型聲明
fn($x = 42) => $x;           // 參數默認值
fn(&$x) => $x;               // 引用傳遞
fn&($x) => $x;               // 引用返回
fn($x, ...$rest) => $rest;   // 變長參數

其實我個人不是很贊同php引入那么多語法糖,這使得php的語法變得越來越復雜,關于此rfc的投票,鳥哥選擇了反對,包括韓天峰大佬也對此特別反對,php應該回歸初心——簡單高效。

7、新增mb_str_split函數

mb_str_split是mbstring擴展中新增的一個函數,通過函數名就可以猜到,它是str_split函數的“增強版(多字節處理)”,它的作用和str_split一樣,都是將字符串拆分成數組,只是增加了第三個參數,用于設置字符編碼。

說明:

mb_str_split ( string $string [, int $split_length = 1, string $encoding = mb_internal_encoding() ] ) : array

例子:

<?php
print_r(mb_str_split("PHP是世界上最好的語言", 3));

// Array
// (
//     [0] => PHP
//     [1] => 是世界
//     [2] => 上最好
//     [3] => 的語言
// )

// 也可以指定編碼
print_r(mb_str_split("PHP是世界上最好的語言", 3, "GB2312"));

8、始終可用的Hash擴展

從PHP7.4開始,Hash擴展是PHP核心擴展,無法通過--disable-hash禁用,因此它始終可用。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

前郭尔| 比如县| 华坪县| 德令哈市| 买车| 福贡县| 济阳县| 瑞金市| 绥棱县| 若尔盖县| 鄂州市| 邯郸县| 玛多县| 英德市| 农安县| 长沙市| 阿拉尔市| 法库县| 克什克腾旗| 寻乌县| 开封市| 迭部县| 秦安县| 论坛| 泾源县| 黄山市| 商水县| 巩留县| 汪清县| 青田县| 全南县| 呈贡县| 台州市| 夏河县| 庆元县| 察雅县| 永靖县| 新平| 蒲城县| 洪泽县| 山丹县|