PHP Conference Nagoya 2025

Функциональность, объявленная устаревшей в PHP 8.0.x

Ядро PHP

  • Если за параметром со значением по умолчанию следует обязательный параметр, то значение по умолчанию не имеет смысла. С PHP 8.0.0 подобный порядок параметров объявлен устаревшим и может быть исправлен путём удаления значения по умолчанию:

    <?php
    function test($a = [], $b) {} // До
    function test($a, $b) {} // После
    ?>

    Одним из исключений из этого правила являются параметры вида Type $param = null, где значение по умолчанию null делает тип неявно обнуляемым. Это пока что ещё разрешено, но вместо этого лучше рекомендуется использовать явный тип nullable:

    <?php
    function test(A $a = null, $b) {} // По-прежнему разрешено
    function test(?A $a, $b) {} // Рекомендуется
    ?>

  • Вызов get_defined_functions() с явно заданным значением false в exclude_disabled устарел и больше не имеет смысла. get_defined_functions() никогда не будет возвращать отключённые функции.

Enchant

LibXML

libxml_disable_entity_loader() объявлена устаревшей. Поскольку теперь используется libxml 2.9.0, в котором загрузка внешних объектов по умолчанию отключена, поэтому использование этой функции больше не требуется для защиты от XXE-атак, если не используется (все ещё уязвимая) LIBXML_NOENT. В этом случае рекомендуется провести рефакторинг кода с помощью libxml_set_external_entity_loader(), чтобы подавить загрузку внешних сущностей.

PGSQL / PDO PGSQL

Библиотека стандартных функций

  • Функции сравнения сортировки, возвращающие true или false теперь сгенерирует предупреждение об устаревшей возможности, поэтому их следует переписать, чтобы они возвращали целое число меньше, равное или больше нуля.

    <?php
    // Заменить подобный код:
    usort($array, fn($a, $b) => $a > $b);
    // На этот:
    usort($array, fn($a, $b) => $a <=> $b);
    ?>

Zip

  • Использование пустого файла в ZipArchive объявлено устаревшим. Libzip 1.6.0 больше не работает с пустыми zip-архивами. Существующее обходное решение будет удалено в следующей версии.

  • Процедурный API Zip объявлен устаревшим. Вместо него используйте ZipArchive. Итерацию по всем записям можно выполнить с помощью ZipArchive::statIndex() и цикла for:

    <?php
    // итерация с использованием процедурного API
    assert(is_resource($zip));
    while (
    $entry = zip_read($zip)) {
    echo
    zip_entry_name($entry);
    }

    // итерация с использованием объектно-ориентированного API
    assert($zip instanceof ZipArchive);
    for (
    $i = 0; $entry = $zip->statIndex($i); $i++) {
    echo
    $entry['name'];
    }
    ?>

Reflection

Добавить

Примечания пользователей 1 note

up
6
dominique dot vienne at ik dot me
3 years ago
If you try to get all methods / functions assigning an optional argument before a mandatory one, try this regex (single line)

<?php
function\s
+[a-z][a-zA-Z0-9_]*\((?:\$[a-z][a-zA-Z0-9]*\s*,\s*)*
(?:\$[
a-z][A-Za-z0-9_]*\s*=[^\$\)]+)+\$[a-z][a-zA-Z0-9_]*\)
?>

for
<?php
public function test($a, $b) {
$a = [];
$b = [$abc => $ss[],
];
}

private function
too($c, $a = true, $b) {
}

protected function
bar($a = []) {
}

public function
foo($a, $b = true) {
}

public function
fooBar32($a=true, $b = [], $c) {
}

private function
oo_bAr($a = []) {
}
?>
it will match too() and fooBar32()

Have a nice migration! ;)
To Top