← Назад к вопросам

Знаешь как указать в коде возвращаемые значения?

1.0 Junior🔥 211 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Указание возвращаемых значений в PHP

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

Основные способы указания возвращаемых значений

1. Типизация возвращаемых значений (Return Type Declarations)

Это наиболее строгий и современный способ, появившийся в PHP 7.0. Указывается после списка параметров через двоеточие.

function sum(int $a, int $b): int {
    return $a + $b; // Должно возвращать именно integer
}

class Calculator {
    public static function divide(float $a, float $b): float {
        if ($b === 0.0) {
            throw new InvalidArgumentException('Division by zero');
        }
        return $a / $b;
    }
}

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

  • Скалярные типы: int, float, string, bool
  • Составные типы: array, callable, iterable
  • Объектные типы: имена классов и интерфейсов
  • Специальные типы: self, parent, mixed (PHP 8.0+)
  • Объединенные типы (PHP 8.0+): int|string, User|null
  • Тип never (PHP 8.1+): для функций, которые никогда не возвращают управление

2. PHPDoc аннотации

Используются для документации и поддержки IDE, но не проверяются во время выполнения.

/**
 * Суммирует два числа
 * 
 * @param int $a Первое число
 * @param int $b Второе число
 * @return int Результат сложения
 */
function add($a, $b) {
    return $a + $b;
}

/**
 * Возвращает пользователя или null
 * 
 * @param int $userId ID пользователя
 * @return User|null Объект пользователя или null
 */
function getUserById(int $userId) {
    // ... логика поиска пользователя
    return $user ?? null;
}

Разница между строгой типизацией и PHPDoc

АспектReturn Type DeclarationsPHPDoc аннотации
ПроверкаПроверяется во время выполненияТолько документация
СтрогостьВызывает TypeError при несоответствииНе влияет на выполнение
Версии PHPPHP 7.0+Все версии
ИспользованиеДля надежности кодаДля документации и IDE

Продвинутые примеры

Объединенные типы (PHP 8.0+)

function parseValue(string $input): int|float|bool {
    if (is_numeric($input)) {
        return strpos($input, '.') !== false ? (float)$input : (int)$input;
    }
    return filter_var($input, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) ?? $input;
}

Тип never (PHP 8.1+)

function redirect(string $url): never {
    header('Location: ' . $url);
    exit(); // Функция никогда не вернет управление
}

function throwException(string $message): never {
    throw new RuntimeException($message);
}

Ковариантность возвращаемых типов

interface Animal {
    public function getFood(): Food;
}

class Dog implements Animal {
    // Может возвращать более конкретный тип DogFood
    public function getFood(): DogFood {
        return new DogFood();
    }
}

Режимы строгости типов

// Файл должен начинаться с declare(strict_types=1) для строгой проверки
declare(strict_types=1);

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

// Без strict_types=1 PHP будет пытаться преобразовывать типы
strictAdd("10", "20"); // Работает без strict_types, вызывает ошибку с strict_types=1

Практические рекомендации

  1. Всегда используйте типизацию возвращаемых значений в новом коде на PHP 7.0+
  2. Комбинируйте с PHPDoc для сложных случаев (например, @return array<int, User>)
  3. Используйте strict_types=1 для предотвращения неявных преобразований
  4. Возвращайте осмысленные значения или выбрасывайте исключения вместо возврата null в ошибочных случаях
  5. Для nullable-типов используйте синтаксис ?Type (PHP 7.1+):
function findUser(int $id): ?User {
    return $users[$id] ?? null;
}

Обработка ошибок через исключения

Вместо возврата специальных значений для ошибок, предпочтительнее использовать исключения:

function divideWithValidation(float $a, float $b): float {
    if ($b === 0.0) {
        throw new DivisionByZeroError('Cannot divide by zero');
    }
    return $a / $b;
}

// Использование
try {
    $result = divideWithValidation(10, 0);
} catch (DivisionByZeroError $e) {
    // Обработка ошибки
}

Указание возвращаемых значений делает код самодокументируемым, повышает надежность за счет проверки типов, улучшает поддержку IDE и помогает избежать ошибок на ранних этапах разработки.

Знаешь как указать в коде возвращаемые значения? | PrepBro