PHP7.1 の新機能
1. Null 許容型
のタイプ型の前に疑問符を追加することで、パラメーターと戻り値を空にすることができるようになりました。この機能が有効な場合、渡されるパラメーターまたは関数によって返される結果は、指定された型または 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 として宣言された場合は、return ステートメントを単純に省略できます。 void の場合、NULL
は正当な戻り値ではありません。function fun() :void { echo "hello world"; }
class Something
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
ログイン後にコピー
4. 反復可能な疑似クラス
class Something { const PUBLIC_CONST_A = 1; public const PUBLIC_CONST_B = 2; protected const PROTECTED_CONST = 3; private const PRIVATE_CONST = 4; }
これはパラメータまたは In で使用できます。戻り値の型は、配列を受け入れるか、Traversable
インターフェイスを実装するオブジェクトを表します。function iterator(iterable $iter) { foreach ($iter as $val) { // } }
1 つの catch Statement ブロックで、パイプ文字 (_|_) を介して複数の例外をキャプチャできるようになりました。これは、異なるクラスの異なる例外を同時に処理する必要がある場合に便利ですtry {
// some code
} catch (FirstException | SecondException $e) {
// handle first and second exceptions
}
ログイン後にコピー
try { // some code } catch (FirstException | SecondException $e) { // handle first and second exceptions }
6。リストはキー名をサポートします
$data = [
["id" => 1, "name" => 'Tom'],
["id" => 2, "name" => 'Fred'],
];
// list() style
list("id" => $id1, "name" => $name1) = $data[0];
var_dump($id1);//1
ログイン後にコピー
7。文字列はサポートします負の方向
$data = [ ["id" => 1, "name" => 'Tom'], ["id" => 2, "name" => 'Fred'], ]; // list() style list("id" => $id1, "name" => $name1) = $data[0]; var_dump($id1);//1
$a= "hello";
$a[-2];//l
ログイン後にコピー
8. コールバックをクロージャに変換
$a= "hello"; $a[-2];//l
Closure には、呼び出し可能を 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');
ログイン後にコピー
<?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
、反変パラメータ入力と共変戻り値に使用できるオブジェクト タイプを導入します。<?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;
}
ログイン後にコピー
Argon2 アルゴリズムを使用してパスワード ハッシュを生成するArgon2 がパスワード ハッシュ API (これらの関数はpassword_で始まる) に追加されました。公開される定数は次のとおりです:PASSWORD_ARGON2I<?php abstract class A { abstract function test(string $s); } abstract class B extends A { abstract function test($s) : int; }
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 リリース時期
2018 年 12 月 6 日
公式 Web サイト PHP7.3 の新機能
2柔軟な
Heredocおよび
Nowdoc 構文の更新
終了タグを単独の行に置いたり、セミコロンを続けたりする必要がなくなりました。同時に、終了タグでもインデントを使用できます。インデントを使用すると、ドキュメント コンテンツの各行で対応するインデントがスキップされます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$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)
}</pre><div class="contentsignin">ログイン後にコピー</div></div>上記の構文では、Heredoc は配列要素として表示され、終了タグは別の行になくインデントされています。定義された文字列の内容では、両方の行のインデントが削除されていることに注意してください。 <p>3 配列の破棄は参照割り当てをサポートします</p>
<p>デモ: </p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$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)</pre><div class="contentsignin">ログイン後にコピー</div></div>
<h2>$b を解析するとき、参照の受け渡しが使用されます。このとき、$b と $v[1] 要素は維持されます。参照関係。 </h2>
<p>4 リスト構造は参照解決をサポートします。 </p>
<p>デモ: </p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$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)</pre><div class="contentsignin">ログイン後にコピー</div></div>
<h2>5 instanceof 演算子はリテラル構文をサポートします。 </h2>
<p>instanceof の最初のオペランドはリテラルをサポートし、非オブジェクト リテラル検出の結果は false です。 </p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">var_dump("literal" instanceof stdClass);
var_dump(42 instanceof stdClass);
var_dump(new stdClass() instanceof stdClass);
bool(false)
bool(false)
bool(true)</pre><div class="contentsignin">ログイン後にコピー</div></div>
<h2>6 呼び出し時のパラメーターの末尾のカンマのサポート </h2>
<p>関数を呼び出すとき、パラメーター リストの後にカンマを使用できます。 </p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">function methodName($p1, $p2)
{
// some statmenet
var_dump($p1, $p2);
}
methodName(10, 20, );
int(10)
int(20)</pre><div class="contentsignin">ログイン後にコピー</div></div>
<h2>関数を呼び出す場合、2 番目 (最後の) パラメーターの後にカンマを追加できます。しかし、その定義は機能しません。 </h2>
<p>7 BC 数学関数</p>
<p></p>bcscale()<h2>この関数は、現在の BC 関数で使用されるスケールの取得をサポートします。 </h2>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">bcscale(3);
var_dump(bcscale());
int(3)</pre><div class="contentsignin">ログイン後にコピー</div></div>
<p>8 LDAP 完全サポート<code>
LDAP: ライトウェイト ディレクトリ アクセス プロトコル、ライトウェイト ディレクトリ アクセス プロトコルは完全にサポートされています。
9 マルチバイト文字列関数の更新
フル機能の Case-Mapping および Case-Folding のサポート大文字と小文字を区別しない文字列演算子は Case-Folding を使用します- Unicode 11 のサポート
- 長い文字列のサポート
- 名前付きキャプチャのサポート
- 10 FastCGI プロセス管理
- 追加次のオプションが使用されますFPM ログを設定するには: (未翻訳)
- decorate_workers_output
- 11 Argon2id アルゴリズムのサポート
- パラメータを設定した後、 --with-password-argon2[=dir]。 Password_*() 関数で Argon2i および Argon2id ハッシュのサポートが提供されました。 PASSWORD_ARGON2ID 定数を使用してアルゴリズムを指定します。 PHP では、libargon2 ライブラリのバージョンが 20161029 以降である (等しい) 必要があります。
12 CompileError 例外により一部のコンパイル エラーが置き換えられます
新しい CompileError 例外が追加され、ParseError はこの例外を継承します。現時点では、Token_parse モードの Token_GET_All() によって発生する可能性のあるコンパイル エラーのみに影響します。
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禁用,因此它始终可用。