首頁  >  文章  >  後端開發  >  總結php7所有版本新特徵【推薦】

總結php7所有版本新特徵【推薦】

藏色散人
藏色散人轉載
2021-09-20 17:09:292449瀏覽

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, &#39;privateFunction&#39;]);
    }

    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_
  • 允許分組命名空間的尾部逗號命名空間可以在PHP 7中使用尾隨逗號進行分組引入。
  • <?php
    
    use Foo\Bar\{
        Foo,
        Bar,
        Baz,
    };
PHP7.3新特性

1 發佈時間

06 Dec 2018

官網PHP7.3新特性

2 更靈活的

Heredoc

Nowdoc

語法

結束標記不再需要獨立一行或緊接分號了。同時結束標記也可以使用縮排,使用縮排時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 &#39;preload&#39;;
}

opcache_compile_file(&#39;hello.php&#39;);

hello.php

<?php 

function hello()
{
    echo &#39;hello&#39;;
}

test.php

<?php

hello();
echo &#39; &#39;;
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[&#39;a&#39;] ??= &#39;a&#39;;
/*等同于*/ $arr[&#39;a&#39;] = $arr[&#39;a&#39;] ?? &#39;a&#39;; 

$b ??= &#39;b&#39;; 
/*等同于*/ $b = $b ?? &#39;b&#39;;

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禁用,因此它始终可用。

原文链接:https://zhuanlan.zhihu.com/p/60544350

以上是總結php7所有版本新特徵【推薦】的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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