この記事は、講義と追跡調査の概要をまとめたものです。
当時の流行に倣って言えば、php7 が出たらすぐに自分のパソコンにインストールし、php5 と php7 を共存させて、すぐに超手間のかかるループスクリプトを書いてテストしてみました。新しい機能といくつかの使用法が廃止されました。
php のアップグレードが最優先事項であるため、会社は近い将来のみアップグレードを計画しているため、以前は php7 によってもたらされる喜びをプライベートで味わうことしかできませんでした。アップグレードを担当した友人が共有してくれました。包括的です。ここにマークを付けてください。メモを取ってください。
推奨 (無料): PHP7
主な調査質問:
1. PHP7 の利点
2.PHP7 の新機能
3. PHP7による廃止
4. PHP7による変更点
5. PHP7のパフォーマンスを最大限に活かす方法
6. PHP7 を歓迎するために、より良いコードを作成するにはどうすればよいですか?
7. 現在のプロジェクト コードをアップグレードして PHP7 と互換性を持たせるにはどうすればよいですか?
はい、パフォーマンスが大幅に向上しました。改善され、機械を節約し、お金を節約できます。
文字列 (string)、整数 (int)、浮動小数点数 (float)、およびブール値 (bool) を使用して、関数のパラメーターの型と関数の戻り値を宣言できます。
declare(strict_types=1); function add(int $a, int $b): int { return $a+$b; } echo add(1, 2); echo add(1.5, 2.6);
php5 は上記のコードを実行できません。php7 が実行されると、最初に 3 とエラーが出力されます (add() に渡される引数 1 は整数型であり、float が指定されている必要があります);
スカラー型宣言には、必須モード (デフォルト) と厳密モードの 2 つのモードがあります。
declare(strict_types=1)、コードを実行するにはファイルの最初の行に配置する必要があります。現在のファイルは有効です。
PHP 7 には、致命的なエラーと回復可能な致命的なエラーが多数あります は例外に変換されて処理されます。これらの例外は、Throwable インターフェイスを実装する Error クラスを継承します (すべての例外はこの基本インターフェイスを実装します)。
PHP7 は、開発者の処理をさらに容易にし、開発者がプログラムをより詳細に制御できるようにします。デフォルトでは、エラーはプログラムを直接中断させますが、PHP7 はエラーをキャプチャして処理する機能を提供し、プログラムを許可します。この実装では、プログラマにより柔軟なオプションが引き続き提供されます。
構文: $c = $a <=> $b
If $a > $ b, $c の値は 1
$a == $b の場合、$c の値は 0
$a
変数が存在し、値が NULL でない場合は、その変数自体の値が返され、それ以外の場合は、その 2 番目のオペランドが返されます。
//原写法 $username = isset($_GET['user]) ? $_GET['user] : 'nobody'; //现在 $username = $_GET['user'] ?? 'nobody';
define('ARR',['a','b']); echo ARR[1];// a
AST は PHP の中間として機能します。コンパイル プロセス インタプリタからオペコードを直接吐き出す元の方法を置き換え、インタプリタ (パーサー) とコンパイラ (コンパイラ) を分離します。これにより、一部のハック コードが削減され、同時に実装の理解と保守が容易になります。
PHP5: PHP コード -> パーサー構文分析 -> OPCODE -> 実行
PHP7: PHP コード -> パーサー構文分析 -> AST -> OPCODE -> 実行
参考: https://wiki.php.net/rfc/abstract_syntax_tree
$anonymous_func = function(){return 'function';}; echo $anonymous_func(); // 输出function
不正なデータのコード インジェクションを防止し、より安全な逆シリアル化データを提供します。
// PHP7以前语法的写法 use FooLibrary\Bar\Baz\ClassA; use FooLibrary\Bar\Baz\ClassB; // PHP7新语法写法 use FooLibrary\Bar\Baz\{ ClassA, ClassB};
Ereg 正規表現
mssql
mysql
sybase_ct
同じ名前のコンストラクターは使用できません
インスタンス メソッドを静的メソッドとして呼び出すことはできません
メソッド call
call_user_method() call_user_method_array()
では call_user_func() と call_user_func_array() を使用する必要があります
暗号化関連関数
mcrypt_generic_end() mcrypt_ecb() mcrypt_cbc() mcrypt_cfb() mcrypt_ofb()
注: PHP7.1 以降の mcrypt_* シーケンス関数は除去される。推奨される使用法: openssl シーケンス関数
その他
set_magic_quotes_runtime set_socket_blocking Split imagepsbbox() imagepsencodefont() imagepsextendfont() imagepsfreefont() imagepsloadfont() imagepsslantfont() imagepstext()
$HTTP_RAW_POST_DATA 変数は削除されました。代わりに php://input を使用してください
# ini ファイルは # で始まるコメントをサポートしなくなり、「;」を使用します。 ASP 形式のサポートとスクリプト構文のサポートを削除しました: <% および < script language=php >変更点PHP71. 文字列処理メカニズムの変更16 進文字を含む文字列は数値とみなされなくなり、別の方法で扱われなくなりました。var_dump("0x123" == "291"); // false var_dump(is_numeric("0x123")); // false var_dump("0xe" + "0x1"); // 0 var_dump(substr("f00", "0x1")) // foo2. 整数処理メカニズム変更
Int64 サポート、さまざまなプラットフォームで整数の長さを統一、2GB を超える文字列とファイルのアップロードをサポート 64 ビット PHP7 文字列長は 2^31 バイトを超える可能性があります。
// 无效的八进制数字(包含大于7的数字)会报编译错误 $i = 0681; // 老版本php会把无效数字忽略。 // 位移负的位置会产生异常 var_dump(1 >> -1); // 左位移超出位数则返回0 var_dump(1 << 64);// 0 // 右位移超出会返回0或者-1 var_dump(100 >> 32);// 0 var_dump(-100 >> 32);// -13. パラメーター処理メカニズムの変更繰り返しのパラメーター命名はサポートされません
function func(a,a,b, c,c,c) {} ;会报错func_get_arg() および func_get_args() これら 2 つのメソッドは、渡された値ではなく、パラメーターの現在の値を返します。現在の値は変更される可能性があります
所以需要注意,在函数第一行最好就给记录下来,否则后续有修改的话,再读取就不是传进来的初始值了。
function foo($x) { $x++; echo func_get_arg(0); } foo(1); //返回2
foreach()循环对数组内部指针不再起作用
$arr = [1,2,3]; foreach ($arr as &$val) { echo current($arr);// php7 全返回0 }
按照值进行循环的时候, foreach是对该数组的拷贝操作
$arr = [1,2,3]; foreach ($arr as $val) { unset($arr[1]); } var_dump($arr);
最新的php7依旧会打印出[1,2,3]。(ps:7.0.0不行)
老的会打印出[1,3]
按照引用进行循环的时候, 对数组的修改会影响循环
$arr = [1]; foreach ($arr as $val) { var_dump($val); $arr[1]=2; }
最新的php7依旧会追加新增元素的循环。(ps:7.0.0不行)
不再按照相反的顺序赋值
//$arr将会是[1,2,3]而不是之前的[3,2,1] list($arr[], $arr[], $arr[]) = [1,2,3];
不再支持字符串拆分功能
// $x = null 并且 $y = null $str = 'xy'; list($x, $y) = $str;
空的list()赋值不再允许
list() = [123];
list()现在也适用于数组对象
list($a, $b) = (object)new ArrayObject([0, 1]);
对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析,而不是之前的混杂着几个特殊案例的情况。 下面这张表说明了这个解析顺序的变化。
引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了
$arr = []; $arr['a'] = &$arr['b']; $arr['b'] = 1; // php7: ['a' => 1, 'b' => 1] // php5: ['b' => 1, 'a' => 1]
1.debug_zval_dump() 现在打印 “int” 替代 “long”, 打印 “float” 替代 “double”
2.dirname() 增加了可选的第二个参数, depth, 获取当前目录向上 depth 级父目录的名称。
3.getrusage() 现在支持 Windows.mktime() and gmmktime() 函数不再接受 is_dst 参数。
4.preg_replace() 函数不再支持 “\e” (PREG_REPLACE_EVAL). 应当使用 preg_replace_callback() 替代。
5.setlocale() 函数不再接受 category 传入字符串。 应当使用 LC_* 常量。
6.exec(), system() and passthru() 函数对 NULL 增加了保护.
7.shmop_open() 现在返回一个资源而非一个int, 这个资源可以传给shmop_size(), shmop_write(), shmop_read(), shmop_close() 和 shmop_delete().
8.为了避免内存泄露,xml_set_object() 现在在执行结束时需要手动清除 $parse。
9.curl_setopt 设置项CURLOPT_SAFE_UPLOAD变更
TRUE 禁用 @ 前缀在 CURLOPT_POSTFIELDS 中发送文件。 意味着 @ 可以在字段中安全得使用了。 可使用 CURLFile作为上传的代替。
PHP 5.5.0 中添加,默认值 FALSE。 PHP 5.6.0 改默认值为 TRUE。. PHP 7 删除了此选项, 必须使用 CURLFile interface 来上传文件。
zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1
只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)
第一次编译成功后,用项目代码去训练PHP,会产生一些profile信息,最后根据这些信息第二次gcc编译PHP就可以得到量身定做的PHP7
需要选择在你要优化的场景中: 访问量最大的, 耗时最多的, 资源消耗最重的一个页面.
参考: http://www.laruence.com/2015/06/19/3063.html
参考: http://www.laruence.com/2015/12/04/3086.html
不使用php7废弃的方法,扩展
使用2个版本都兼容的语法特性【 list ,foreach, func_get_arg 等】
检测工具:https://github.com/sstalle/php7cc
官方5.6.x移植7.0.x 文档
Laruence 让PHP7达到最高性能的tips
博客-PHP7特征
Zval的变更
以上がPHP5.6からPHP7へアップグレードする方法のまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。