Rumah >pembangunan bahagian belakang >PHP7 >Ringkasan ciri baharu semua versi php7 [disyorkan]

Ringkasan ciri baharu semua versi php7 [disyorkan]

藏色散人
藏色散人ke hadapan
2021-09-20 17:09:292568semak imbas

Ciri baharu PHP7.1

1 Jenis boleh dibatalkan

Parameter dan jenis nilai pulangan kini boleh dibatalkan dengan menambahkan tanda soal sebelum jenis. Apabila ciri ini didayakan, parameter yang dihantar masuk atau hasil yang dikembalikan oleh fungsi adalah sama ada daripada jenis yang diberikan, atau 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 > Kaedah yang nilai pulangan diisytiharkan sebagai jenis batal mungkin hanya meninggalkan pernyataan pulangan. Untuk batal, NULL

bukan nilai pulangan yang sah.

3. Keterlihatan berterusan kelas
function fun() :void
{
  echo "hello world";
}

4 Digunakan dalam parameter atau jenis nilai pulangan, ia mewakili objek yang menerima tatasusunan atau melaksanakan antara muka
class Something
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}
Boleh Dilalui

.

5 🎜 >Blok pernyataan tangkapan kini boleh menangkap berbilang pengecualian melalui aksara paip (_|_). Ini berguna apabila anda perlu mengendalikan pengecualian berbeza daripada kelas yang berbeza pada masa yang sama

function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}

6 senarai menyokong nama utama

7. aksara Rentetan menyokong negatif
try {
    // some code
} catch (FirstException | SecondException $e) {
    // handle first and second exceptions
}

8 Tukar panggilan balik kepada penutupan
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// list() style
list("id" => $id1, "name" => $name1) = $data[0];
var_dump($id1);//1

Penutupan telah menambah kaedah statik baharu untuk menukar boleh dipanggil Adalah Penutupan. objek.

$a= "hello";
$a[-2];//l

9. http2 service push

Sokongan untuk http2 server push kini telah ditambahkan pada sambungan CURL

Pautan asal: https: //cloud.tencent.com/dev...
<?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');

Ciri baharu PHP7.2Jenis objek baharu

Jenis objek baharu ini,

, Memperkenalkan sebarang jenis objek yang boleh digunakan untuk input parameter kontravarian dan pulangan kovarian.

Benarkan mengatasi kaedah abstrak

Apabila kelas abstrak mewarisi daripada kelas abstrak lain, kelas abstrak yang diwarisi boleh mengatasi kaedah abstrak kelas abstrak yang diwarisi.

objectGunakan algoritma Argon2 untuk menjana cincang kata laluan

<?php

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

test(new Stdclass());
Argon2 telah ditambahkan pada API pencincangan kata laluan (fungsi ini bermula dengan kata laluan_), berikut ialah pemalar yang terdedah:

<?php

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

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

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • Benarkan pengumpulan koma jejak untuk ruang nama
  • PASSWORD_ARGON2_DEFAULT_TIME_COST Ruang nama boleh diperkenalkan dalam PHP 7 menggunakan koma belakang untuk mengumpulkan.
  • PASSWORD_ARGON2_DEFAULT_THERADSCiri baharu PHP7.3
1 Masa Keluaran

06 Dis 2018

Tapak web rasmi PHP7.3 ciri baharu
<?php

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

2 Sintaks

dan

yang lebih fleksibel Teg penutup

tidak lagi perlu berada pada baris yang berasingan atau diikuti dengan koma bertitik. Pada masa yang sama, teg penutup juga boleh menggunakan lekukan Apabila lekukan digunakan, setiap baris kandungan dokumen akan melangkau lekukan yang sepadan.

Dalam sintaks di atas, Heredoc muncul sebagai elemen tatasusunan dan teg akhir tidak berada pada baris yang berasingan dan diinden. Ambil perhatian bahawa dalam kandungan rentetan yang ditentukan, lekukan kedua-dua baris telah dilucutkan.

Heredoc3 Pemusnahan tatasusunan menyokong tugasan rujukanNowdoc

Demo:

$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)
}
Apabila menghuraikan $b, hantaran rujukan digunakan, pada masa ini $b dan $v[ 1] Elemen mengekalkan hubungan rujukan.

4 Struktur senarai menyokong resolusi rujukan.

Demonstrasi:

$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)
5 instanceof operator menyokong sintaks literal

Operan pertama instanceof menyokong literal, hasil pengesanan literal bukan jenis objek adalah palsu.

6 Menyokong koma mengekor untuk parameter semasa memanggil

$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)
Apabila memanggil fungsi, koma dibenarkan selepas senarai parameter.

Apabila memanggil fungsi, menambah koma selepas parameter kedua (terakhir) dibenarkan. Tetapi definisi tidak berfungsi.

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

bool(false)
bool(false)
bool(true)
Fungsi matematik 7 SM

fungsi menyokong mendapatkan skala yang digunakan oleh fungsi BC semasa.

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

int(10)
int(20)

8 LDAP disokong sepenuhnya

LDAP: Protokol Akses Direktori Ringan, protokol akses direktori ringan disokong sepenuhnya.

9 kemas kini fungsi rentetan berbilang baitbcscale()

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

int(3)
Sokongan Pemetaan Kes dan Lipatan Kes berciri penuh

Pengendali rentetan tidak sensitif huruf menggunakan Kes -Lipatan

Sokongan Unicode 11

Sokongan rentetan panjang
  • Sokongan penangkapan nama
  • 10 pengurusan proses FastCGI
  • ditambah Pilihan berikut digunakan untuk mengkonfigurasi FPM Log: (belum diterjemahkan)
  • log_limit
log_buffering

decorate_workers_output

    11 Argon2id Algoritma menyokong
  • --dengan-kata laluan-argon2[=dir] selepas mengkonfigurasi parameter. Menyediakan sokongan untuk cincang Argon2i dan Argon2id dalam fungsi Kata Laluan_*(). Gunakan pemalar PASSWORD_ARGON2ID untuk menentukan algoritma. PHP memerlukan versi perpustakaan libargon2 lebih besar daripada (sama dengan) 20161029.
  • 12 Pengecualian CompileError menggantikan beberapa ralat kompilasi
  • Pengecualian CompileError baharu ditambahkan dan ParseError mewarisi pengecualian ini. Pada masa ini hanya mempengaruhi ralat kompilasi yang mungkin disebabkan oleh Token_GET_All() dalam mod Token_parse.

13 Peningkatan Prestasi

PHP7.3 dikatakan 22% lebih pantas daripada PHP 7.0. Belum diuji, berikan ujian tekanan jika anda mempunyai peluang.

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

Atas ialah kandungan terperinci Ringkasan ciri baharu semua versi php7 [disyorkan]. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:segmentfault.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam