← Назад к вопросам
Знаешь как указать в коде возвращаемые значения?
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 Declarations | PHPDoc аннотации |
|---|---|---|
| Проверка | Проверяется во время выполнения | Только документация |
| Строгость | Вызывает TypeError при несоответствии | Не влияет на выполнение |
| Версии PHP | PHP 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
Практические рекомендации
- Всегда используйте типизацию возвращаемых значений в новом коде на PHP 7.0+
- Комбинируйте с PHPDoc для сложных случаев (например,
@return array<int, User>) - Используйте
strict_types=1для предотвращения неявных преобразований - Возвращайте осмысленные значения или выбрасывайте исключения вместо возврата
nullв ошибочных случаях - Для 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 и помогает избежать ошибок на ранних этапах разработки.