Codeby web-security - новый курс от Codeby Security School

Представляем вашему вниманию новый курс от команды The Codeby - "Тестирование Веб-Приложений на проникновение с нуля". Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое. Подробнее ...


Оглавление:

  1. Изменения не совместимые со старыми версиями
  2. Новые особенности
  3. Изменения в модулях SAPI
  4. Устаревшая функциональность
  5. Изменённые функции
  6. Новые функции
  7. Новые классы и интерфейсы
  8. Удалённые расширения и SAPI
  9. Другие изменения в расширениях
  10. Новые глобальные константы
  11. Изменение в работе файла INI
  12. Поддержка Windows
  13. Другие изменения

1. Изменения не совместимые со старыми версиями

Изменения языка

Изменения по работе с переменными

  • Ссылки на непрямые переменные, свойства и методы теперь интерпретируются слева-направо. Несколько примеров:
$$foo['bar']['baz'] // интерпретируется как ($$foo)['bar']['baz']
$foo->$bar['baz'] // интерпретируется как ($foo->$bar)['baz']
$foo->$bar['baz']() // интерпретируется как ($foo->$bar)['baz']()
Foo::$bar['baz']() // интерпретируется как (Foo::$bar)['baz']()

Для восстановления предыдущего поведения добавьте явные фигурные скобки:

${$foo['bar']['baz']}
$foo->{$bar['baz']}
$foo->{$bar['baz']}()
Foo::{$bar['baz']}()
  • Ключевое слово global теперь принимает только простые переменные. Вместо
global $$foo->bar;

теперь нужно писать так:

global ${$foo->bar};
  • Скобки вокруг переменных или вызовов функций больше не имеют какого либо влияния на их поведение. Например, следующий код, где результат вызова функции передаётся функции по ссылке
function getArray() { return [1, 2, 3]; }

$last = array_pop(getArray());
// Строгий стандарт: Только переменные должны быть переданы по ссылке
$last = array_pop((getArray()));
// Строгий стандарт: Только переменные должны быть переданы по ссылке

теперь будет вызывать ошибку строгих стандартов, где бы не использовались скобки. Раньше для второго случая не генерировалось предупреждение.

  • Элементы массива или свойства объекта, которые создаются автоматически во время назначения по ссылке, теперь будут в ином порядке в результатах. Например
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);

теперь результатом будет массив [«a» => 1, «b» => 1], в то время как раньше результатом было [«b» => 1, «a» => 1];

Связанные RFC:

https://wiki.php.net/rfc/uniform_variable_syntax

https://wiki.php.net/rfc/abstract_syntax_tree

Изменения для list()

  • list() больше не будет назначать переменные в обратном порядке. Например
list($array[], $array[], $array[]) = [1, 2, 3];
var_dump($array);

теперь результатом будет $array == [1, 2, 3] вместо [3, 2, 1]. Обратите внимание, что изменился только порядок назначения, но назначенные значения остаются прежними. Например, нормальное использование вроде

list($a, $b, $c) = [1, 2, 3];
// $a = 1; $b = 2; $c = 3;

сохранит текущее поведение.

  • Больше неразрешено назначение пустого list(). Таким образом, все последующие примеры неверны:
list() = $a;
list(,,) = $a;
list($x, list(), $y) = $a;
  • list() больше не поддерживает распакованных строк (хотя раньше они поддерживались в некоторых случаях). Код
$string = "xy";
list($x, $y) = $string;

теперь будет иметь результат $x == null и $y == null (без замечаний) вместо $x == "x" и $y == "y". Кроме того, list() теперь гарантированно работает с объектами реализации ArrayAccess, например.

list($a, $b) = (object) new ArrayObject([0, 1]);

теперь будет иметь результат $a == 0 и $b == 1. Раньше обе $a и $b были null.

Связанные RFC:

https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list

https://wiki.php.net/rfc/fix_list_behavior_inconsistency

Изменения для foreach

Итерации с foreach() больше не оказывают какого-либо эффекта на внутренний указатель массива, которые может быть затронут через функции из рода current()/next()/и т.д. Например

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

теперь напечатает значение int(0) три раза. Раньше вывод был int(1), int(2) и bool(false).

  • Когда итерируется массив по величине, foreach теперь всегда будет оперировать с копией массива, таким образом, изменения массива во время итераций не окажут влияния на итерационное поведение. Например
$array = [0, 1, 2];
$ref =& $array; // Необходимо вызвать старое поведение
foreach ($array as $val) {
var_dump($val);
unset($array[1]);
}

теперь напечатает все три элемента (0 1 2), а раньше второй элемент 1 пропускался (0 2).

  • Когда итерируется массив по ссылки, модификации к массиву будут продолжать оказывать влияние на итерацию. Тем не менее, теперь в ряде случаев PHP будет выполнять работу лучше по поддержанию верной позиции. Например, добавленный к массиву во время итерации по ссылке
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}

теперь также будет перебирать и добавленный элемент. Следовательно вывод этого примера будет "int(0) int(1)", в то время как раньше вывод был только "int(0)".

  • Перебор простых (non-Traversable) объектов по значению или по ссылке будет вести себя как перебор массивов по ссылке. Это соответствует предыдущему поведению помимо более точному управлению позиции, упомянутой в предыдущем пункте.

Перебор Traversable объектов остаётся неизменным.

Связанная RFC: https://wiki.php.net/rfc/php7_foreach

Изменения в обработке параметра

  • Больше невозможно задать два параметра функции с одинаковым именем. Например, следующий метод вызовет ошибку во время компиляции:
public function foo($a, $b, $unused, $unused) {
// ...
}

Код вроде этого должен быть изменён для использования отдельных имён параметров, например:

public function foo($a, $b, $unused1, $unused2) {
// ...
}
  • Функции func_get_arg() и func_get_args() больше не возвращают первоначальное значение, которое было передано в параметр и вместо этого будут предоставлять текущую величину (которая могла и измениться). Например
function foo($x) {
$x++;
var_dump(func_get_arg(0));
}
foo(1);

теперь будет печатать "2" вместо "1". Этот код должен быть изменён для выполнении модификаций после вызова func_get_arg(s)

function foo($x) {
var_dump(func_get_arg(0));
$x++;
}

или полностью избежать изменения параметров:

function foo($x) {
$newX = $x + 1;
var_dump(func_get_arg(0));
}
  • Аналогично исключение цепочек вызова больше не будет отображать первоначальное значение, которое было передано в функцию, а показывать вместо него изменённое значение. Например
function foo($x) {
$x = 42;
throw new Exception;
}
foo("string");

теперь приведёт к результату в трассировке стека:

Stack trace:
#0 file.php(4): foo(42)
#1 {main}

а раньше было так:

Stack trace:
#0 file.php(4): foo('string')
#1 {main}

Хотя это не должно оказать влияние на поведение вашего кода при выполнении, полезно знать об этой разнице для целей отладки.

Такое же ограничение распространяется также на debug_backtrace() и другие функции, контролирующие аргументы функций..

Связанные RFC: https://wiki.php.net/phpng

Изменения в обработке целых чисел

  • Невалидные восьмеричные литералы (содержащие цифры больше 7) теперь вызывают ошибку компилятора. Например, следующее больше невалидно:
$i = 0781; // 8 невалидное восьмеричное число!

Раньше невалидные восьмеричные (и любые следующие валидные цифры) просто игнорировались. Раньше бы $i имел значение 7, поскольку последние две цифры были бы молча отброшены.

  • Битовые сдвиги отрицательных чисел теперь выбросят ArithmeticError:
var_dump(1 >> -1);
// ArithmeticError: Bit shift by negative number
  • Левый битовый сдвиг числа бита за пределами ширины бита целого числа всегда будет приводить к результату 0:
var_dump(1 << 64); // int(0)

Раньше поведение этого кода зависло от используемой архитектуры CPU. Например, на x86 (включая x86-64) результат был int(1),, поскольку сдвиг операнда был обёрнут.

  • Подобным образом правый битовый сдвиг на число бит за пределами шитовой ширины целого числа всегда будет приводить к результату 0 или -1 (в зависимости от знака):
var_dump(1 >> 64); // int(0)
var_dump(-1 >> 64); // int(-1)

Связанные RFC: https://wiki.php.net/rfc/integer_semantics

Изменения в обработке строк

Строки, которые содержат шестнадцатеричные числа, больше не рассматриваются как числовые и больше не получают специальной обработки. Несколько примеров нового поведения:

var_dump("0x123" == "291"); // bool(false) (раньше true)
var_dump(is_numeric("0x123")); // bool(false) (раньше true)
var_dump("0xe" + "0x1"); // int(0) (раньше 16)

var_dump(substr("foo", "0x1")); // string(3) "foo" (раньше "oo")
// Примечание: встретилось не хорошо сформированое числовое значение

filter_var() может быть использован для проверки, содержит ли строка шестнадцатеричное число или конвертирует такую строку в целочисленное число:

$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
throw new Exception("Invalid integer!");
}
var_dump($int); // int(65535)
  • Благодаря дополнению в Unicode Codepoint Escape Syntax для строк в двойных кавычках и встроенных документах, "u{", после которой следуют невалидная последовательность, вызовет ошибку:
$str = "u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence

Для избежания этого нужно экранировать первый слэш:

$str = "\u{xyz}"; // Работает нормально

Тем не менее, "u" без последующей { не затронуты. Таким образом, следующий код не приведёт к ошибке и будет прекрасно работать как и раньше:

$str = "u202e"; // Работает прекрасно

Связанные RFC:

* https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings

* https://wiki.php.net/rfc/unicode_escape

Изменения в обработке ошибок

  • Теперь есть два класса исключений: Exception и Error. Оба класса реализуют новый интерфейс Throwable. Типы подсказок в коде обработки исключений, возможно, придётся изменить, чтобы учесть это.
  • Некоторые фатальные ошибки и восстанавливаемые фатальные ошибки теперь выбрасывают Error. Error — это отдельный от Exception класс, эти исключение не будут ловиться существующими блоками try/catch.

Для восстанавливаемых фатальных ошибок, которые были преобразованы в исключения, больше невозможно молча игнорировать ошибку от обработчика ошибок. В особенности больше невозможно игнорировать ошибки с type.

  • Ошибки парсера теперь генерируют ParseError, которые наследует Error. Обработка ошибок для eval() на потенциально невалидном коде должан быть изменена на перехват ParseError в дополнение к предыдущей возвращаемой величине / error_get_last() на основе обращения.
  • Конструкторы внутренних классов всегда будут выбрасывать исключение в случае неудачи. Раньше некоторые конструкторы возвращали NULL или неиспользуемый объект.
  • Уровень ошибок некоторых предупреждений E_STRICT был изменён.

Связанные RFC:

https://wiki.php.net/rfc/engine_exceptions_for_php7

https://wiki.php.net/rfc/throwable-interface

https://wiki.php.net/rfc/internal_constructor_behaviour

https://wiki.php.net/rfc/reclassify_e_strict

Другие изменения в языке

  • Удалена поддержка формирования несовместимого контекста this для статичных вызовов к нестатичным вызовам.
class A {
public function test() { var_dump($this); }
}

// Обратите внимание: НЕ наследует A
class B {
public function callNonStaticMethodOfA() { A::test(); }
}
(new B)->callNonStaticMethodOfA();

// Deprecated: Non-static method A::test() should not be called statically
// Notice: Undefined variable $this
NULL

Обратите внимание, что это только применимо к вызовам из несовместимого контекста. В классе B, наследующем от A, вызов должен быть позволен без каких либо замечаний.

  • Больше невозможно использовать следующие имена классов, интерфейсов и траэйтов (без учёта регистра):
bool
int
float
string
null
false
true

Это применимо к объявлению класса/интерфейса/трэйта, class_alias() и использованию утверждений.

Более того, следующие имена класса, интерфейса и трэйта зарезервированы для будущего использования, но ещё не приводят к ошибке во время использования:

resource
object
mixed
numeric
  • Конструкции языка yield больше не требуют круглых скобок когда используются в контекстных выражения. Теперь правоассоциативной оператор с приоритетом между "печать" и оператором "=>. Это может приводить к различному поведению в различных случаях, например:
echo yield -1;
// Раньше интерпретировалось как
echo (yield) - 1;
// А теперь интерпретируется как
echo yield (-1);

yield $foo or die;
// Раньше интерпретировалось как
yield ($foo or die);
// А теперь это интерпретируется как
(yield $foo) or die;

Такие случае всегда могут быть разрешены добавлением дополнительных скобок.


Paranoid - курс от Codeby Security School

Представляем вашему вниманию курс от команды codeby - "Комплекс мер по защите персональных данных, анонимности в интернете и не только" Подробнее ...


  • Удаление тегов ASP (<%) и script (<script language=php>). (RFC: https://wiki.php.net/rfc/remove_alternative_php_tags)
  • Удалена поддержка присвоения результата new по ссылке.
  • Убрана поддержка вызовов с заданной областью не статичных методов для несовместимого контекста $this. Смотрите подробности в https://wiki.php.net/rfc/incompat_ctx.
  • Удаление поддержки комментариев # в файлах ini. Используйте для комментариев ; вместо них.
  • $HTTP_RAW_POST_DATA больше не доступна. Используйте вместо поток php://input.

Изменения в стандартных библиотеках

  • call_user_method() и call_user_method_array() больше не существуют.
  • ob_start() больше не выводит E_ERROR, но вместо него E_RECOVERABLE_ERROR в случае создания выводного буфера в обработчике выводного буфера.
  • Улучшен zend_qsort (используется алгоритм гибридной сортировки) для лучшей производительности, также переименован zend_qsort в zend_sort.
  • Добавлен стабильный алгоритм сортировки zend_insert_sort.
  • Удалена функция dl() на fpm-fcgi.
  • setcookie() с пустым именем кукиз теперь вызывают WARNING (предупреждение) и больше не отправляют пустую строку заголовка set-cookie.

Другое

Curl:

  • Удалена поддержка для отключающей опции CURLOPT_SAFE_UPLOAD. Все загружаемые curl файлы должны использовать curl_file / CURLFile API.

Дата:

  • Удалён параметр $is_dst из mktime() и gmmktime().

DBA

  • dba_delete() теперь возвращает false если ключ также не был найден в обработчике ini файла.

GMP

  • Теперь требуется libgmp версии 4.2 или новее.
  • gmp_setbit() и gmp_clrbit() теперь возвращают FALSE для отрицательных индексов, далая их последовательными с другими функциями GMP.

Intl:

  • Удалены устаревшие псевдонимы datefmt_set_timezone_id() и IntlDateFormatter::setTimeZoneID(). Используйте вместо них datefmt_set_timezone() и IntlDateFormatter::setTimeZone().

libxml:

  • Добавлена опция парсинга LIBXML_BIGLINES. Она доступна начиная с libxml 2.9.0 и добавляет поддержку для номеров строк >16-бит в отчётах об ошибках.

Mcrypt

  • Удаление устаревших псевдонимов mcrypt_generic_end() в пользу mcrypt_generic_deinit().
  • Удаление устаревших функций mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() и mcrypt_ofb() в пользу mcrypt_encrypt() и mcrypt_decrypt() с флагом MCRYPT_MODE_*.

Сессия

  • session_start() принимает все настройки INI settings как массив, например, [‘cache_limiter’=>’private’] устанавливает session.cache_limiter=private. Она также поддерживает 'read_and_close', которая закрывает сессионные данные немедленно после чтения данных.
  • Сохранение обработчиков accepts validate_sid(), update_timestamp(), которые валидируют существование ID сессии, обновляют метку времени сессионных данных. Совместимость со старыми определёнными пользователями обработчиками сохранения оставлена.
  • Добавлен SessionUpdateTimestampHandlerInterface. validateSid(), updateTimestamp() определены в этом интерфейсе.
  • session.lazy_write(default=On) настрока INI включает запись данных сессии только когда данные сессии обновляются.

Opcache

  • Удалена конфигурационная директива opcache.load_comments. Сейчас загрузка комментариев doc ничего не делает и всегда включена.

OpenSSL:

  • Удаление контекстной опции SSL "rsa_key_size" в пользу автоматических настроек надлежащего размера, заданного согласованным криптографическим алгоритмом.
  • Удалены контекстные опции SSL "CN_match" и "SNI_server_name". Используйте вместо неё автоматическое определение или опцию "peer_name".

PCRE:

  • Удалена поддержка для модификатора /e (PREG_REPLACE_EVAL). Используйте вместо него preg_replace_callback().

PDO_pgsql:

  • Удалён атрибует PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT в пользу ATTR_EMULATE_PREPARES.

Стандартные:

  • Удалена поддержка строковых категорий в etlocale(). Используйте вместо неё константы LC_*.
  • Удалена set_magic_quotes_runtime() и её псевдоним magic_quotes_runtime().

JSON:

  • Отклонён несовместимый формат номеров RFC 7159 в строке json_decode — верхний уровень (07, 0xff, .1, -.1) и все уровни ([1.], [1.e1])
  • Вызов json_decode с первым аргументом равным PHP строке или величине, которая при приведении к строке является пустой строкой (NULL, FALSE) приводит к результату ошибка синтаксиса JSON.

Поток:

  • Удаление set_socket_blocking() в пользу его псевдонима stream_set_blocking().

XSL:

  • Удалена ini опция xsl.security_prefs. Используйте вместо неё XsltProcessor::setSecurityPrefs().

2. Новые особенности

Ядро

  • Добавлено групповое использование объявлений. (RFC: https://wiki.php.net/rfc/group_use_declarations)
  • Добавлен объединяющий оператор null (??). (RFC: https://wiki.php.net/rfc/isset_ternary)
  • Поддержка строк с длинной >= 2^31 байт в 64-битных сборках.
  • Добавлен метод Closure::call() (работает только с классами пользовательского пространства).
  • Добавлен синтаксис u{xxxxxx} Unicode Codepoint Escape для строк в двойных кавычках и встроенных документах.
  • define() теперь поддерживает массивы как константные величины, фиксит контроль, где define() до сих пор не поддерживает синтаксис констант.
  • Добавлен оператор сравнения (<=>), также известный как оператор «космический корабль». (RFC: https://wiki.php.net/rfc/combined-comparison-operator)
  • Добавлен yield из оператора для делегирования сопрограмм вроде Генераторов (Generators). (RFC: https://wiki.php.net/rfc/generator-delegation)
  • Зарезервированные ключевые слова теперь могут быть использованы в различных новых контекстах. (RFC: https://wiki.php.net/rfc/context_sensitive_lexer)
  • Добавлена поддержка для скалярных объявлений и строго режима объявления с использованием (strict_types=1) (RFC: https://wiki.php.net/rfc/scalar_type_hints_v5)
  • Добавлена поддержка для криптографически безопасного языка пользователя RNG (RFC: https://wiki.php.net/rfc/easy_userland_csprng)

Opcache

  • Добавлен кэш опкода второго уровня, основанного на файлах (экспериментально — отключено по умолчанию). Для его включения, PHP должен быть настроен и собран с —enable-opcache-file, затем конфигурационная директива opcache.file_cache=<DIR> должна быть помещена в php.ini. Кэш второго уровня может увеличить производительность при перезапуске сервера или сброса SHM. Вдобавок возможно использовать файловый кэш совсем без SHM, используя opcache.file_cache_only=1 (это может быть полезно для общего хостинга) и отключение проверки соответствия файлового кэша для ускорения загрузки в ущерб безопасности, используя opcache.file_cache_consistency_checks=0.

OpenSSL

  • Добавлена контекстная опция "alpn_protocols" SSL, позволяющая шифровать потоки клиент/сервер для согласования альтернативных протоколов, использующих расширение ALPN TLS, когда собраны с OpenSSL 1.0.2 или новее. Информация о согласованных протоколов принимается через вывод stream_get_meta_data().

Reflection

  • Добавлен класс ReflectionGenerator (yield из Traces, текущего файла/строки и т.д.)
  • Добавлен класс ReflectionType для улучшенной поддержки объявлений функций новых типов и скалярных типов. Новые методы ReflectionParameter::getType() и ReflectionFunctionAbstract::getReturnType() оба возвращают экземпляр ReflectionType.

Поток:

  • Только для Windows была добавлена новая контекстная опция потока, позволяющая блокировать чтения по трубам. Для её включения используйте array("pipe" => array("blocking" => true)), когда создаёте потоковый контекст. Знайте, что эта опция при определённых обстоятельствах может стать причиной мёртвого запирания на буфере трубы. Тем не менее, она может быть полезной в некоторых сценариях CLI.

3. Изменения в модулях SAPI

FPM

  • Исправлена ошибка #65933 (Не может определить конфигурационные строки длиннее 1024 байт).
  • Listen = port теперь прослушивает на всех адресах (IPv6 и IPv4-mapped).

4. Устаревшая функциональность

Ядро

  • Конструкции в стиле PHP 4, когда имя конструктора точно такое же как и имя класса, теперь устарели.
  • Статические вызовы к нестатическим методам теперь устарели.

OpenSSL

  • Контекстная опция SSL "capture_session_meta" теперь устаревшая. Мета данные, касающиеся активного криптоалгоритма на потоке источника, теперь принимается через возвращаемый результат из from stream_get_meta_data().

5. Изменённые функции

parse_ini_file():

parse_ini_string():

  • Добавлен режим сканера INI_SCANNER_TYPED для набранных yield .ini значений.

unserialize():

  • Добавлен второй параметр для функции десериализации (RFC: https://wiki.php.net/rfc/secure_unserialize) позволяющие определить принимаемые классы: unserialize($foo, [«allowed_classes» => [«MyClass», «MyClass2»]]);

proc_open():

  • Максимальное количество труб, используемое proc_open(), раньше было ограничено жёстко заданным значением 16. Это ограничение теперь убрано и количество труб фактически ограничено количеством доступной для PHP памяти.
  • Только для Windows, новая опция "blocking_pipes" может быть использована для принудительной блокировки чтения на дочерних трубах процесса. Это охватывает несколько крайних случаев использования CLI, тем не менее, это может вести к мёртвым запираниям. Также это коррелирует с новыми контекстными опциями потока для труб.

array_column():

  • Эта функция теперь поддерживает массив объектов, а также двухмерные массивы. Рассматриваются только публичные свойства, а объекты, которые используют _get() для динамических свойств, должны также реализовывать __isset().

stream_context_create()

  • Теперь она принимает только конфигурацию Windows array("pipe" => array("blocking" => <boolean>)), что принудительно блокирует чтение на трубах. Эта опция должна использоваться осторожно, поскольку из-за ограничения этой платформы, возможны мёртвые запирания на буферах труб.

6. Новые функции

GMP

  • Добавлена Added gmp_random_seed().

PCRE:

  • Добавлена функция preg_replace_callback_array
    (RFC: https://wiki.php.net/rfc/preg_replace_callback_array)

Стандартные:

  • Добавлена функция intdiv() для целочисленного деления.
  • Добавлена функция error_clear_last() для сброса статуса ошибок.

Zlib:

  • Добавлены функции deflate_init(), deflate_add(), inflate_init(), inflate_add(), позволяющие инкрементное/потоковое сжатие/декомпрессию.

7. Новые классы и интерфейсы

8. Удалённые расширения и SAPI

  • sapi/aolserver
  • sapi/apache
  • sapi/apache_hooks
  • sapi/apache2filter
  • sapi/caudium
  • sapi/continuity
  • sapi/isapi
  • sapi/milter
  • sapi/nsapi
  • sapi/phttpd
  • sapi/pi3web
  • sapi/roxen
  • sapi/thttpd
  • sapi/tux
  • sapi/webjames
  • ext/mssql
  • ext/mysql
  • ext/sybase_ct
  • ext/ereg

Для дополнительных подробностей смотрите

https://wiki.php.net/rfc/removal_of_dead_sapis_and_exts

https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7

ВНИМАНИЕ: по поводу NSAPI не голосовали в RFC, тем не менее, она была удалена. Это также означает, что соответствующий SDK больше недоступен.

9. Другие изменения в расширениях

Mhash

  • Mhash больше не является расширением, используйте функцию function_exists("mhash") для проверки, доступен ли он.

GD

  • Комплект libgd требует libwebp вместо libvpx для функциональности WebP.

10. Новые глобальные константы

Ядро

  • Добавлена PHP_INT_MIN.

Zlib

  • Эти константы добавлены для контроля поведения стирания с новыми инкрементными функциями deflate_add() и inflate_add():

    • ZLIB_NO_FLUSH
    • ZLIB_PARTIAL_FLUSH
    • ZLIB_SYNC_FLUSH
    • ZLIB_FULL_FLUSH
    • ZLIB_BLOCK
    • ZLIB_FINISH

GD

  • Поддержка T1Lib удалена, причиной этому стало появление новой зависимости для T1Lib. Следовательно, следующее больше недоступно:

Функции:

  • imagepsbbox()
  • imagepsencodefont()
  • imagepsextendedfont()
  • imagepsfreefont()
  • imagepsloadfont()
  • imagepsslantfont()
  • imagepstext()

Ресурсы:

  • 'шрифт gd PS'
  • 'кодировка gd PS'

11. Изменение в работе файла INI

Ядро

  • Удалена ini директива asp_tags. Попытка её включить вызовет фатальную ошибку.
  • Удалена ini директива always_populate_raw_post_data.

12. Поддержка Windows

Ядро

  • Поддержка нативных 64-битных чисел в 64-битных сборках.
  • Поддержка огромных файлов в 64-битных сборках.
  • Поддержка для getrusage()

ftp

  • Расширение ftp теперь всегда поставляется совместно
  • Для поддержки SSL была упразднена зависимость расширения openssl. Теперь поддержка SSL зависит только от библиотеки openssl. Если она присутствует во время компиляции, ftp_ssl_connect() включается автоматически.

odbc

  • Расширение odbc всегда поставляется совместно

13. Другие изменения

Ядро

  • Вместо того, чтобы быть неопределёнными и платформозависимыми, NaN и Infinity теперь всегда будут нулём, когда они применяются в роли целого числа.
  • Вызов метода не-объекта теперь вызывает перехватываемую ошибку вместо фатальной ошибки, смотрите https://wiki.php.net/rfc/catchable-call-to-member-of-non-object
  • Сообщения об ошибках zend_parse_parameters, нюансы с типами и приобразованиями теперь всегда говорят "integer" и "float" вместо "long" и "double".
  • Вывод буферизации теперь продолжает работу для прерванного соединения, если опция ignore_user_abort установлена в true.

Codeby Market от Сodeby

Мы запустили свой магазин CodebyMarket Equipment for InfoSec. Уже добавили RaspberryAlfa Long-RangeOrange PiArduino и многое другое. Купить Pentesting Devices