Функции PHP 8: обновления и примеры использования

Раздел: PHP -> версии PHP

Основные нововведения в функциях PHP 8

Как вызывать функции с передачей аргументов по имени?

Именованные аргументы (Named Arguments)

В PHP 8 появилась возможность передавать аргументы по имени, а не только по позиции. Это позволяет пропускать необязательные параметры, менять порядок аргументов и делает код самодокументируемым.


function createUser(string $name, int $age = 18, string $city = 'Unknown', bool $active = true): void {
    echo "Name: $name, Age: $age, City: $city, Active: " . ($active ? 'Yes' : 'No') . "\n";
}

// Вызов с именованными аргументами
createUser(name: 'Alice', city: 'Moscow', age: 25);

Php 8 request (особенности обработки запросов в php 8)

В примере параметр $active не передан, поэтому используется значение по умолчанию true. Аргументы указаны в произвольном порядке.

Возможные проблемы:

  • Нельзя использовать именованный аргумент после позиционного. Следующий код вызовет ошибку: createUser('Bob', city: 'London');
  • Именованные аргументы не работают с функциями, которые используют func_get_args() или ...$args (вариативные параметры), если в вызове есть смешивание.
  • Совместимость: код на PHP 7 не выполнится.

Решение: в новых проектах использовать именованные аргументы для улучшения читаемости, особенно в функциях с большим количеством необязательных параметров. При рефакторинге стоит проверять версию PHP и наличие вариативных параметров.

Как указать, что параметр может принимать несколько типов?

Union Types

Объединённые типы позволяют объявить параметр, возвращаемое значение или свойство как один из нескольких типов.


function formatPrice(int|float $price): string {
    return number_format($price, 2) . ' руб.';
}

echo formatPrice(1000);     // int
echo formatPrice(99.99);    // float
echo formatPrice('100');    // Ошибка типа

Php 8.4 windows (php 8.4 на windows)

Типы перечисляются через вертикальную черту. Можно комбинировать с nullable (?int|float или int|float|null).

Типичные ошибки:

  • Попытка передать значение неподходящего типа (например, строку, если она не объявлена) приведёт к TypeError.
  • В старых версиях PHP код не будет работать.

Как заменить громоздкий switch более лаконичным выражением?

Match Expression

Конструкция match - это улучшенная альтернатива switch, которая возвращает значение, поддерживает строгое сравнение и множественные условия.


$status = 200;
$message = match ($status) {
    200, 204 => 'Success',
    301, 302 => 'Redirect',
    400, 404 => 'Not Found',
    500 => 'Server Error',
    default => 'Unknown'
};
echo $message; // Success

Php 7 функции (новые функции php 7)

match не требует break и выполняет только первую подходящую ветку. Используется строгое сравнение (===).

Проблемы:

  • Если ни одна ветка не совпала и нет default, выбрасывается UnhandledMatchError.
  • В отличие от switch, не поддерживает блоки кода без возврата (можно, но не рекомендуется).

Как безопасно обращаться к свойствам или методам потенциально null-объектов?

Nullsafe Operator

Оператор ?-> позволяет вызывать методы или получать свойства, не проверяя каждый раз на null. Если значение null, цепочка обрывается и возвращается null.


class Address {
    public function getCity(): ?string { return 'Moscow'; }
}
class User {
    public ?Address $address = null;
}

$user = new User();
// Раньше требовалась проверка:
$city = $user->address !== null ? $user->address->getCity() : null;
// Теперь:
$city = $user?->address?->getCity();
echo $city ?? 'Город не указан';

обновление php wordpress (обновление версии php для wordpress)

Оператор работает только с методами и свойствами, не с массивами.

Ошибки:

  • Использование ?-> в цепочке с обычным -> может привести к ошибке, если промежуточное значение null, а следующий вызов обычный.
  • Не подходит для вызова функций или конструкций, отличных от доступа к объекту.

Как проверить наличие подстроки без использования strpos?

Новые строковые функции: str_contains, str_starts_with, str_ends_with

В PHP 8 добавлены удобные функции для работы со строками, возвращающие boolean.


$email = 'user@example.com';
if (str_contains($email, '@')) {
    echo 'Email содержит @';
}
if (str_starts_with($email, 'user')) {
    echo 'Начинается с user';
}
if (str_ends_with($email, '.com')) {
    echo 'Заканчивается на .com';
}

Эти функции учитывают регистр (чувствительны). Для регистронезависимой проверки используйте str_contains(strtolower($str), ...) или mb_ аналоги.

Проблемы:

  • В старых версиях PHP эти функции не определены. Необходимо обновление или полифилл.
  • Не поддерживают многобайтовые символы (кириллица) без mb_ версий, которых пока нет. Для юникода используйте mb_strpos с проверкой.
- Php 8 function (функции php 8)
- Php 5 server (php 5 сервер)
- язык php 5 (php 5)

Расширенные примеры использования функций PHP 8

Дополнительные примеры с пояснениями и результатами выполнения.

Именованные аргументы с классами

Пример

class Product {
    public function __construct(
        public string $name,
        public float $price = 0.0,
        public int $quantity = 1,
        public ?string $description = null
    ) {}
}

$product = new Product(
    name: 'Ноутбук',
    quantity: 5,
    description: 'Игровой ноутбук'
);
var_dump($product);
object(Product)#1 (4) {
  ["name"] => string(14) "Ноутбук"
  ["price"] => float(0)
  ["quantity"] => int(5)
  ["description"] => string(26) "Игровой ноутбук"
}

Параметр $price не передан, используется значение по умолчанию 0. Имена аргументов совпадают с именами свойств в конструкторе благодаря Constructor Property Promotion.

Union Types с nullable и void

Пример

function findUser(int $id): User|false|null {
    // Логика поиска
    if ($id === 1) {
        return new User('Alice');
    }
    if ($id === 0) {
        return null; // не найден или ошибка
    }
    return false; // например, некорректный id
}

$result = findUser(0);
var_dump($result);
NULL

Тип возврата объявлен как User|false|null - функция может вернуть объект, логическое false или null. Это удобнее, чем смешивать разные типы без объявления.

Match с возвратом в разных контекстах

Пример

$value = 5;
$result = match (true) {
    $value < 0 => 'Отрицательное',
    $value === 0 => 'Ноль',
    $value > 0 && $value <= 10 => 'Маленькое положительное',
    $value > 10 => 'Большое',
};
echo $result; // Маленькое положительное

Конструкция match (true) позволяет использовать произвольные условия вместо сравнения с одним значением. Каждая ветка вычисляется как логическое выражение.

Nullsafe оператор в цепочке глубоких вызовов

Пример

$order = new Order();
$city = $order?->getUser()?->getAddress()?->city ?? 'Неизвестно';
echo $city;

Если любой из методов возвращает null, цепочка прерывается, и результат равен null, после чего оператор ?? подставляет значение по умолчанию. При использовании обычных вызовов -> на null возникла бы ошибка.

str_contains с кириллицей и многобайтовыми строками

Пример

$text = 'Привет, мир!';
// str_contains работает с однобайтовыми кодировками, для UTF-8 могут быть проблемы:
var_dump(str_contains($text, 'мир'));
// Надёжнее использовать mb_strpos:
var_dump(mb_strpos($text, 'мир') !== false);
bool(true)
bool(true)

В PHP 8 str_contains корректно обрабатывает UTF-8, так как использует внутреннее представление строк. Однако в некоторых окружениях или при работе с необычными Unicode последовательностями может потребоваться mb_-функция.

функции PHP 8 - comments

En
Php 8 function (php)