Как работать с типами данных в строгом режиме?php-71

Строгий режим типизации (strict_types) — это важная особенность PHP, введенная в версии 7.0, которая значительно улучшает предсказуемость кода. Вот полное руководство по работе с ним:

1. Активация строгого режима

declare(strict_types=1); // Должно быть первой инструкцией в файле
  • Директива действует только в текущем файле
  • Не влияет на другие подключаемые файлы без аналогичного объявления

2. Основные особенности строгого режима

Строгая проверка типов аргументов

function add(int $a, int $b): int {
    return $a + $b;
}

add("5", 2); // TypeError в strict mode, но работает в нестрогом

Строгая проверка возвращаемых значений

function divide(float $a, float $b): int {
    return $a / $b; // TypeError если результат не integer
}

3. Поддерживаемые типы

PHP поддерживает следующие типы в strict mode:

  • Скалярные: int, float, string, bool
  • Специальные: array, callable, iterable
  • Объекты: ClassName, self, parent
  • Nullable: ?type (начиная с PHP 7.1)
  • Псевдотипы: mixed (PHP 8.0+), void

4. Особенности преобразования типов

В строгом режиме не происходит автоматического приведения типов:

function greet(string $name) {
    echo "Hello, $name";
}

greet(123); // TypeError в strict mode

5. Union Types

function handleInput(int|string $input): void {
    if (is_int($input)) {
        echo "Integer: $input";
    } else {
        echo "String: $input";
    }
}

6. Правила работы с типами

  1. Точное соответствие типов:

    function sendMessage(string $text): void {}
    
    sendMessage(100); // Ошибка в strict mode
    
  2. Nullable-типы:

    function findUser(?int $id): ?User {}
    
  3. Типизированные свойства (PHP 7.4+):

    class User {
        public int $id;
        public string $name;
    }
    

7. Обработка ошибок типизации

В strict mode возникают исключения TypeError, которые нужно обрабатывать:

try {
    add("5", 2);
} catch (TypeError $e) {
    error_log("Type error: " . $e->getMessage());
    // Альтернативная логика
}

8. Best Practices

  1. Всегда включать strict mode в новых проектах
  2. Явно преобразовывать типы при необходимости:
    function process(int $value) {}
    process((int) "100"); // Явное приведение
    
  3. Использовать assert() для дополнительных проверок
  4. Комбинировать с PHPDoc для IDE:
    /** @param array<int> $ids */
    function processIds(array $ids) {}
    

Резюмируем:

Строгий режим типизации:

  • Включается директивой declare(strict_types=1)
  • Требует точного соответствия типов
  • Генерирует TypeError при несоответствиях
  • Работает только в пределах файла
  • Лучше сочетать с современными возможностями PHP (union types, typed properties)
  • Значительно повышает надежность кода

Для легаси-кода рекомендуется постепенное внедрение с явным приведением типов.