Прочие изменения

Замечания и предупреждения при выполнении арифметических операций с некорректными строками

Новые ошибки уровней E_WARNING и E_NOTICE были добавлены при использовании некорректных строк с операторами, ожидающими числа (+ - * / ** % << >> | & ^) и их эквивалентами с присваиванием. Ошибка уровня E_NOTICE выдается, когда строка начинается с цифр, но далее содержит не цифровые символы, и ошибка уровня E_WARNING выдается тогда, когда строка вообще не содержит цифр.

<?php
'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

Предупреждение при переполнении экранированной восьмеричной последовательности

Ранее, 3-октетная восьмиричная строка переполнялась никому ничего не сообщая. Теперь, при переполнении, будет вызвана ошибка уровня E_WARNING.

<?php
var_dump
("\500");

Результат выполнения данного примера:

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

Исправлена несогласованность $this

В то время как $this считается специальной переменной в PHP, ей не хватало специальных проверок, что ее не используют в качестве переменной и не переопределили. Теперь использовать $this в качестве пользовательской переменной запрещено. Также запрещено присваивать ей значение и использовать в глобальном пространстве имен.

Генерация идентификаторов сессий без хеширования

Идентификаторы сессий больше не хешируются во время создания. Вместе с этим удалены следующие четыре параметра из ini-файла:

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

И добавлены два других:

  • session.sid_length - определяет длину идентификатора сессии. По умолчанию используется 32 символа для обеспечения обратной совместимости.
  • session.sid_bits_per_character - определяет количество бит на каждый символ идентификатора (т.е. можно увеличить количество доступных, для использования в идентификаторе, символов). Для обратной совместимости, по умолчанию используется 4 бита.

Изменения в обработке INI-файлов

precision

Если установлено в -1, то будет использован режим dtoa. Значение по умолчанию 14.

serialize_precision

Если установлено в -1, то будет использован режим dtoa. Теперь значение по умолчанию -1.

gd.jpeg_ignore_warning

Значение по умолчанию для этой настройки php.ini изменено на 1, так что, по умолчанию, предупреждения libjpeg будут игнорироваться.

opcache.enable_cli

В PHP 7.1.2 значение по умолчанию для этой настройки php.ini изменено на 1 (включено)

Генерация идентификаторов сессий только с помощью CSPRNG

Идентификаторы сессий теперь создаются только с помощью CSPRNG.

Более информативное сообщение TypeError если допустим NULL

Теперь исключение TypeError для проверок типа arg_info предоставляет более информативное сообщение об ошибке. Если тип параметра или возвращаемого значения может быть NULL (если имеет значение NULL по умолчанию или в принципе является обнуляемым). Теперь в сообщении будет упомянуто "must be ... or null" или "must ... or be null."

add a note add a note

User Contributed Notes 3 notes

up
12
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';)
up
2
tuxedobob
1 month 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.
up
1
mikey1974 at gmail DOT com
1 month 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: https://github.com/php/php-src/commit/1e82ad8038d3100b7e27be870652c1f639a7200a .
To Top