PHP 7.1.20 Released



数値形式ではない文字列を使って、数値を期待する演算 (+ - * / ** % << >> | & ^ や、これらを用いた代入演算) を行おうとしたときに、 E_WARNING あるいは E_NOTICE レベルのエラーが発生するようになりました。 E_NOTICE が発生するのは、文字列が数値で始まっていながら非数値で終わる場合で、 E_WARNING が発生するのは文字列中に数値が含まれない場合です。

'1b' 'something';


Notice: A non well formed numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d


これまでのバージョンでは、八進表記のエスケープシーケンスがオーバーフローを起こしても、 警告は発生しませんでした。 PHP 7.1 以降では、この場合に E_WARNING が発生するようになりました (オーバーフローを起こした場合の振る舞いは、これまでのバージョンと変わりません)。



Warning: Octal escape sequence overflow \500 is greater than \377 in %s on line %d
string(1) "@"

$this の矛盾の修正

PHP において $this は特別な変数という扱いですが、 これが他の場所で変数名として使われていたり再代入されていたりしないことを、 きちんとチェックできていませんでした。 これを修正してきちんとチェックするようになったので、 $this をユーザー定義の変数名として使ったり他の値を再代入したり、 グローバル変数にしたりすることはできなくなりました。

ハッシュなしでのセッション ID の生成

セッション ID の生成時にハッシュされないようになりました。 この変更に伴い、以下の INI 項目が削除されました。

  • session.entropy_file
  • session.entropy_length
  • session.hash_function
  • session.hash_bits_per_character

また、以下のふたつの INI 項目が新たに追加されました。

  • session.sid_length - セッション ID の長さを指定します。デフォルトは 32 文字で、 これは過去のバージョンとの互換性を考慮したものです。
  • session.sid_bits_per_character - 一文字あたりに格納するビット数を指定します (つまり、これを増やすとセッション ID に使える文字の範囲が拡大します)。 デフォルトは 4 で、これは過去のバージョンとの互換性を考慮したものです。

INI ファイルの扱いに関する変更


If the value is set to -1, then the dtoa mode 0 is used. The default value is still 14.


If the value is set to -1, then the dtoa mode 0 is used. The value -1 is now used by default.


The default of this php.ini setting has been changed to 1, so by default libjpeg warnings are ignored.


The default of this php.ini setting has been changed to 1 (enabled) in PHP 7.1.2.

Session ID generation with a CSPRNG only

Session IDs will now only be generated with a CSPRNG.

More informative TypeError messages when NULL is allowed

TypeError exceptions for arg_info type checks will now provide more informative error messages. If the parameter type or return type accepts NULL (by either having a default value of NULL or being a nullable type), then the error message will now mention this with a message of "must be ... or null" or "must ... or be null."

add a note add a note

User Contributed Notes 4 notes

ksours at internbrands dot com
1 year ago
It isn't documented anywhere that I can find, but there is another change to the string warnings in php7.1

$x = "";
$x['foo'] = 'bar';

Will quietly convert $x to an array in php70.  In php71 it will emit a warning and set the first character of $x to 'b' (roughly interpreting the line as $x[0] = 'b';)
9 months ago
I'm sure this is something that some people think is the greatest thing ever, but to me, the warnings thrown by "bad" string to number conversion are a complete pain in the ass.

Plenty of code relies on the idea that 7 + '' = 7, no warning thrown, because that's expected.

I don't want to disable all warnings, just this one, but I can't, so now there's going to be

$total += (is_numeric($val) ? $val : 0);

all over the place.
4 months ago
Note that using Incrementing/Decrementing operators on string is legal
= "";
echo ++
$str; // output: 1
mikey1974 at gmail DOT com
8 months ago
The idea behind throwing warnings in arithmethics is good (3 + "dogs" is useless), but in RFC was forgotten special case which causes a lot of pain ever since PHP 7.1 - arithmethics with 1. empty strings and 2. NULLs. These should NOT emit warnings and should be silently converted in non-strict mode. This is how PHP worked ever for years. Emiting warnings on empty strings and NULLs would be however OK in strictly typed mode. It's particularly this commit, which should be fixed: .
To Top