ホームページ  >  記事  >  バックエンド開発  >  php7の非互換性について詳しく解説

php7の非互換性について詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-06-27 10:10:003186ブラウズ

非互換性

1. foreach は内部配列ポインターを変更しなくなりました

PHP7 より前では、配列が foreach を介して反復されると、配列ポインターが移動していました。今後、これは当てはまらなくなります。以下のコードを参照してください。

<?php
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}

PHP5 出力:

int(1)
int(2)
bool(false)

PHP7 出力:

int(0)
int(0)
int(0)

2、参照による foreach走査時の反復機能の向上

参照を使用して配列を走査する場合、foreach は反復中の変更をより適切に追跡できるようになりました。たとえば、反復中に反復値を配列に追加するには、次のコードを参照してください:

<?php
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}

PHP5 出力:

int(0)

PHP7 出力:

int(0)
int(1)

3、16 進数の文字列は数値とみなされなくなりました

含まれる 16 進数の文字列は数値とみなされなくなりました

<?php
var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));

PHP5 出力:

bool(true)
bool(true)
int(15)
string(2) "oo"

PHP7 出力:

bool(false)
bool(false)
int(0)
注意: /tmp/test.php の 5 行目で整形式でない数値が見つかりました
string (3) "foo"

4. PHP7 で削除された関数

削除された関数のリストは次のとおりです:

call_user_func() および call_user_func_array() は、PHP 4.1.0 から非推奨になりました。

非推奨の mcrypt_generic_end() 関数は削除されました。代わりに mcrypt_generic_deinit() を使用してください。

非推奨の mcrypt_ecb()、mcrypt_cbc()、mcrypt_cfb()、および mcrypt_ofb() 関数は削除されました。

set_magic_quotes_runtime() とそのエイリアス magic_quotes_runtime() は PHP 5.3.0 で非推奨となり、マジック クオートの非推奨により PHP 5.4.0 では機能も失いました。

廃止された set_socket_blocking() 関数は削除されました。代わりに stream_set_blocking() を使用してください。

dl() は PHP-FPM では使用できなくなりましたが、CLI および埋め込み SAPI では引き続き使用できます。

GD ライブラリ内の次の関数が削除されました: imagepsbbox()、imagepsencodefont()、imagepsextendfont()、imagepsfreefont()、imagepsloadfont()、imagepsslantfont()、imagepstext()

設定ファイル php.ini で、 always_populate_raw_post_data、asp_tags、xsl.security_prefs は削除されました。

5. new 演算子によって作成されたオブジェクトは、参照によって変数に代入できません。

<?php
class C {}
$c =& new C;

PHP5 の出力:

の代入。参照による new の戻り値は、/tmp/test.php の 3 行目で非推奨になりました

PHP7 出力:

解析エラー: 構文エラー、/tmp/test.php の 3 行目で予期しない 'new' (T_NEW) が発生しました

6. ASP の削除とスクリプト PHP タグ

ASP のようなタグを使用し、PHP コードを区別するためのスクリプト タグが削除されました。 影響を受けるタグは次のとおりです: 72637aecae1027e7d023ac098a170986、332000003288cabbdff89f9a8e5a919b、842e8e9dd470ac0da5d8b75be3525bf2 2cacc6d41bbb37262a98f745aa00fbf0

7. 通話中不一致のコンテキストで静的に非静的メソッドは PHP 5.6 で非推奨になりましたが、PHP 7.0 では、呼び出されたメソッドで未定義の $this 変数が発生し、この動作が非推奨であるという警告が表示されます。

<?php
class A {
public function test() { var_dump($this); }
}
// 注意:并没有从类 A 继承
class B {
public function callNonStaticMethodOfA() { A::test(); }
}
(new B)->callNonStaticMethodOfA();

PHP5 出力:

非推奨: /tmp/test.php の 8 行目で互換性のないコンテキストから $this を想定しているため、非静的メソッド A::test() を静的に呼び出すべきではありません

object(B)#1 (0) {

}

PHP7 出力:

非推奨: 非静的メソッド A::test() は /tmp/test.php の 8 行目で静的に呼び出すべきではありません

注意: 未定義の変数: / にありますtmp/test.phpの3行目

NULL


8. 値がオーバーフローすると内部関数が失敗します

浮動小数点数を整数に変換する際、浮動小数点数が大きすぎると表現できません。この場合、以前のバージョンでは、内部関数はエラーを発生させずに整数を直接切り捨てていました。 PHP 7.0 では、これが発生すると、E_WARNING エラーが発生し、NULL が返されます。

9. JSON 拡張子が JSOND に置き換えられました

JSON 拡張子が JSOND 拡張子に置き換えられました。 数値の処理に関して注意すべき点は 2 つあります。まず、数値をピリオド (.) で終わらせることはできません (たとえば、値 34. は 34.0 または 34 と記述する必要があります)。 次に、科学表記法を使用して値を表現する場合、e の前にピリオド (.) を付けることはできません (たとえば、3.e3 は 3.0e3 または 3e3 と記述する必要があります)

10。INI ファイル内の # コメント形式。は削除されました

ファイル INI ファイルでは、# で始まるコメント行はサポートされなくなりました。コメントを示すには (セミコロン) を使用してください。 この変更は、php.ini と、parse_ini_file() および parse_ini_string() 関数で処理されるファイルに適用されます。

11. $HTTP_RAW_POST_DATA は削除されました

$HTTP_RAW_POST_DATA 変数は提供されなくなりました。 代わりに php://input を使用してください。

12. Yield が右結合演算子に変更されました

在使用 yield 关键字的时候,不再需要括号, 并且它变更为右联接操作符,其运算符优先级介于 print 和 => 之间。 这可能导致现有代码的行为发生改变。可以通过使用括号来消除歧义。

<?php
echo yield -1;
// 在之前版本中会被解释为:
echo (yield) - 1;
// 现在,它将被解释为:
echo yield (-1);
yield $foo or die;
// 在之前版本中会被解释为:
yield ($foo or die);
// 现在,它将被解释为:
(yield $foo) or die;

以上がphp7の非互換性について詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。