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; }
.
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 negatiftry { // 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 CURLPautan asal: https: //cloud.tencent.com/dev...<?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');
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.
object
Gunakan algoritma Argon2 untuk menjana cincang kata laluan
<?php function test(object $obj) : object { return new SqlQueue(); } test(new Stdclass());
<?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_THERADS
Ciri baharu PHP7.3
<?php use Foo\Bar\{ Foo, Bar, Baz, };
2 Sintaks
danyang 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.Heredoc
3 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) }
$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)
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, 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 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 penangkapan nama
- 10 pengurusan proses FastCGI
- ditambah Pilihan berikut digunakan untuk mengkonfigurasi FPM Log: (belum diterjemahkan)
- log_limit
- 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 '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禁用,因此它始终可用。