ホームページ  >  記事  >  バックエンド開発  >  php7 の主な新機能を見てみましょう

php7 の主な新機能を見てみましょう

coldplay.xixi
coldplay.xixi転載
2020-06-28 16:26:423567ブラウズ


php7 の主な新機能を見てみましょう

これまでのところ、PHP は php7 の RC5 バージョンを正式にリリースしました。これで、php7 の主要な機能は確実に完成しました。これ以上の変更はありません。後続のいくつかのバージョンの反復は、主にバグ修正、最適化などです。私たちが楽しみにしていた php7 の主な変更点について話しましょう。

新機能プレビュー

ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG
增加抽象语法树,使编译更加科学
64位的INT支持
统一的变量语法
原声的TLS - 对扩展开发有意义
一致性foreach循环的改进
新增 <=>、**、?? 、\u{xxxx}操作符
增加了返回类型的声明
增加了标量类型的声明
核心错误可以通过异常捕获了
增加了上下文敏感的词法分析

関連学習の推奨事項: PHP エントリーからマスターまでのプログラミング

#一部の機能が削除されました

1. いくつかの古い拡張機能が削除され、PECL に移行されました (例: mysql)
2. SAPI のサポートを削除
3. 4. 16 進文字列変換が廃止されました

//PHP5
"0x10" == "16"

//PHP7
"0x10" != "16"

5 HTTP_RAW_POST_DATA は削除されました (代わりに php://input を使用できます)

6. 静的関数は、互換性のない $this
$o = & new className{ を介した非静的関数の呼び出しをサポートしなくなりました。
7.php.ini ファイルはコメントとして # を削除し、コメントに ; を使用します

動作が一部変更されました

同じ名前の関数定義パラメーターはサポートされなくなりました。
同じ型のコンストラクターは推奨されなくなりました (現在は削除されておらず、後で削除される予定です)
String、int、float およびその他のキーワードは使用できません。クラス名として使用されます
func_get_args() は現在の変数の値を取得します

function test ($num) {
  $num++;
  var_dump(func_get_args()[0]);
};

test(1)

//PHP5
int(1)

//PHP7
int(2)

以下は、PHPer に適したいくつかの主要なものとコアなものの選択です。重要な機能を紹介します

PHP NG

新しい php エンジンは多くの場所で最適化されており、公式にはこのおかげで php7 のパフォーマンスが php5 よりも優れています。ほぼ 2 倍の向上です。

ZVAL構造の再構成

#左側がPHP5のzval(24バイト)、右側がPHP5のzval PHP7 (16 バイト) ;

php7 の zval は php5 よりも複雑ですが、24 バイトから 16 バイトに削減できることがわかります。

C 言語では、struct の各メンバー変数は独立したメモリ空間を占有しますが、union のメンバー変数はメモリ空間を共有します (union は php7 で struct を置き換えるために広く使用されています)。したがって、メンバー変数がはるかに増えているように見えますが、パブリック変数の多くが占める実際のメモリ領域は減少しています。

新しい Zend 配列を使用して以前の HashTale 構造を置き換えます

弊社の PHP で最も使用され、最も有用で、最も便利で、最も柔軟ですプログラム 配列であり、php5 の最下層は HashTable で実装されていましたが、php7 では新しい Zend Array 型を使用し、パフォーマンスとアクセス速度が大幅に向上しました。
非常に一般的に使用される一部の低コスト関数は、直接エンジンでサポートされるオペコードになります

call_user_function(_array) => ZEND_INIT_USER_CALL
is_int/string/array/* => ZEND_TYPE_CHECK
strlen => ZEND_STRLEN
defined => ZEND+DEFINED

新しいメモリ割り当てと管理方法を使用してメモリの無駄を削減します
コア ソート zend_sort 最適化

//PHP5 - 快速排序(非稳定排序)
array(1 => 0, 0 => 0)

//PHP7 - 快速排序+选择排序(稳定排序)
array(0 => 0, 1 => 0)

16 未満の要素には選択ソートを使用し、16 を超える要素には 16 単位に分割し、それぞれ選択ソートを使用してから、それらをすべて結合してクイック ソートを使用します。以前のソートと比較して、内部要素が非安定ソートから安定ソートに変更され、要素の交換回数が減り、メモリ上の演算回数が減り、パフォーマンスが 40% 向上しました。
抽象構文ツリー

このようなニーズがある場合は、PHP ソース ファイルで構文検出を実行し、コーディング標準を実装する必要があります。 php5 より前には、AST は存在せず、オペコードはパーサーから直接生成されていました。これを実現するには、いくつかの外部 php 構文パーサーを使用する必要があります。php7 には AST が追加されており、そのような拡張機能を自分で実装でき、拡張機能によって提供される関数を使用して、ファイルに対応する AST 構造を直接取得できます。この構造は、識別できるので、これに基づいて最適化と判断を行うことができます。

64 ビット INT サポート

2GB を超える文字列の保存をサポート
2GB を超えるファイルのアップロードをサポート
文字列が次のとおりであることを確認してください。 [64 ビット] はすべてのプラットフォームで 64 ビットです
統一された構文変数

$$foo[&#39;bar&#39;][&#39;baz&#39;]

//PHP5
($$foo)[‘bar&#39;][&#39;baz&#39;]

//PHP7: 遵循从左到右的原则
${$foo[‘bar&#39;][&#39;baz&#39;]}

foreach ループの改善

//PHP5
$a = array(1, 2, 3);foreach ($a as $v){var_dump(current($a));}
int(2)
int(2)
int(2)

$a = array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a));}
int(2)
int(3)
bool(false)

$a = array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a));}
int(1)
int(1)
int(1)

//PHP7:不再操作数据的内部指针了
$a = array(1, 2, 3);foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

$a = array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a))
int(1)
int(1)
int(1)

$a = array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

いくつかの新しい演算子

//<=> - 比较两个数的大小【-1:前者小于后者,0:前者等于后者,1:前者大于后者】
echo 1 <=> 2;//-1
echo 1 <=> 1;//0
echo 1 <=> 0;//1

// ** - 【a的b次方】
echo 2 ** 3;//8

//?? - 三元运算符的改进
//php5
$_GET[&#39;name&#39;] ? $_GET[&#39;name&#39;] : &#39;&#39;;//Notice: Undefined index: …
//php7
$_GET[&#39;name&#39;] ?? &#39;&#39; -> &#39;&#39;;

//\u{xxxx} - Unicode字符的解析
echo "\u{4f60}";//你
echo "\u{65b0}";//新

戻り値の型の宣言

function getInt() : int {
  return “test”;
};

getInt();

//PHP5
#PHP Parse error: parse error, expecting &#39;{&#39;...

//PHP7
#Fatal error:Uncaught TypeError: Return value of getInt() must be of the type integer, string returned

スカラー型の宣言

function getInt(int $num) : int {
  return $num;
};

getInt(“test”);

//PHP5
#PHP Catchable fatal error: Argument 1 passed to getInt() must be an instance of int, string given…

//PHP7
#Fatal error: Uncaught TypeError: Argument 1 passed to getInt() must be of the type integer, string given…

コアエラーは例外を通じて捕捉できる

try {
  non_exists_func();
} catch(EngineException $e) {
  echo “Exception: {$e->getMessage();}\n”;
}

//这里用php7试了一下还是没法捕获,但是看鸟哥介绍说是可行的。。。
#Exception: Call to undefined function non_exists_func()

機密性の高い字句解析

//PHP5
class Collection {public function foreach($arr) {}}
#Parse error: parse error, expecting `"identifier (T_STRING)”&#39;...

//PHP7
class Collection {
  public function foreach($arr) {}
  public function in($arr){}
  public function where($condition){}
  public function order($condition){}
}
$collection = new Collection();
$collection->where()->in()->foreach()->order();

以上です。 php7 の予備的な理解はほぼ完了しました。間違いや低レベルの間違いがたくさんあるはずです。私が修正してメモできるように、皆さんが時間内に修正してくれることを願っています。おいおい!

以上がphp7 の主な新機能を見てみましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。