Ответ
Начиная с PHP 7, можно и нужно указывать тип возвращаемого значения (return type declaration) после списка аргументов, используя двоеточие (:). Это улучшает читаемость, обеспечивает безопасность типов на этапе выполнения и помогает IDE с автодополнением.
Синтаксис и основные типы:
// 1. Скалярные типы (int, float, string, bool)
function calculateTotal(int $quantity, float $price): float {
return $quantity * $price;
}
// 2. Возврат объектов/интерфейсов
function createUserService(): UserServiceInterface {
return new UserService();
}
// 3. Возврат массива (array) или итерируемого объекта (iterable)
function getConfig(): array {
return ['cache' => true, 'debug' => false];
}
// 4. Возврат nullable-типа (может вернуть указанный тип ИЛИ null)
function findUserById(int $id): ?User { // Синтаксис '?Type'
return User::find($id); // Вернёт User или null
}
// 5. Функция, которая ничего не возвращает (void)
function logMessage(string $message): void {
file_put_contents('app.log', $message, FILE_APPEND);
// Не требуется return
}
// 6. Функция, которая никогда не возвращает управление (never) - PHP 8.1+
function redirectAndExit(string $url): never {
header('Location: ' . $url);
exit(); // Или throw new Exception()
// Код после exit() никогда не выполнится
}
Union Types (Объединённые типы) - PHP 8.0+
Можно указать, что функция возвращает значение одного из нескольких типов.
function parseInput(string $input): int|string|bool {
if (is_numeric($input)) {
return (int) $input; // Возвращает int
}
if ($input === 'true' || $input === 'false') {
return $input === 'true'; // Возвращает bool
}
return $input; // Возвращает string
}
Практическое применение и ошибки:
Если функция возвращает значение, не соответствующее заявленному типу, будет выброшена исключение TypeError (в режиме strict_types=1) или произойдёт попытка неявного приведения типа.
declare(strict_types=1); // Строгая проверка типов
function getAge(): int {
return '25 years'; // TypeError: Return value must be of type int, string returned
}
function getAgeWithoutStrict(): int {
return '25'; // Без strict_types произойдёт неявное приведение к int, вернётся 25
}
Итог: Указание типов возврата — это стандарт современного PHP-кода. Это самодокументирующаяся практика, которая предотвращает множество ошибок на раннем этапе.
Ответ 18+ 🔞
А, ну вот, опять про эти ваши типы возврата в PHP. Слушай, я тебе как старый пердун, который ещё на PHP 4 писал, скажу — раньше-то было проще, но и пиздеца в коде было овердохуища. А теперь хоть какая-то определённость, ёпта.
Так, смотри. Начиная с седьмой версии, можно и нужно после скобок с аргументами воткнуть двоеточие и написать, что твоя функция, блядь, должна вернуть. Это как договор с интерпретатором: «Чувак, я обещаю, что отсюда выйдет только float, а если не float — ты меня убей нахуй». И читать легче, и IDE подсказывает, и ошибок меньше — красота.
Как это выглядит и что можно указать:
// 1. Обычные типы (int, float, string, bool) — элементарщина.
function calculateTotal(int $quantity, float $price): float {
return $quantity * $price; // Вернёт число с плавающей точкой, и никаких гвоздей.
}
// 2. Вернуть объект или интерфейс — тоже ок.
function createUserService(): UserServiceInterface {
return new UserService(); // Главное, чтобы объект подходил под интерфейс, а то будет тебе хиросима.
}
// 3. Массив или iterable (что-то, по чему можно пройтись циклом).
function getConfig(): array {
return ['cache' => true, 'debug' => false]; // Возвращай хоть пустой массив, но массив, сука.
}
// 4. А вот это интересно — nullable-тип (может вернуть указанный тип ИЛИ null).
function findUserById(int $id): ?User { // Видишь вопросик перед типом? Это магия.
return User::find($id); // Найдёт — вернёт User, не найдёт — вернёт null. Всё честно.
}
// 5. Функция, которая нихуя не возвращает (void).
function logMessage(string $message): void {
file_put_contents('app.log', $message, FILE_APPEND);
// Никакого return не нужно. Сделал дело — иди нахуй.
}
// 6. А это для самоубийц — never (PHP 8.1+). Функция, которая НИКОГДА не вернёт управление.
function redirectAndExit(string $url): never {
header('Location: ' . $url);
exit(); // Или выкинет исключение. После этого кода — тишина, вакуум, нихуя.
// Если ты тут напишешь return — PHP тебя сожрёт с потрохами.
}
Union Types (Объединённые типы) — с PHP 8.0 можно указать несколько вариантов.
Раньше, блядь, приходилось городить костыли, а теперь — красота.
function parseInput(string $input): int|string|bool {
if (is_numeric($input)) {
return (int) $input; // Вернёт int
}
if ($input === 'true' || $input === 'false') {
return $input === 'true'; // Вернёт bool
}
return $input; // Вернёт string
// И всё довольны. Главное — не вернуть что-то левое, типа массива, а то будет тебе пиздопроебибна.
}
А теперь про ошибки и подводные камни, ёбана.
Если функция попытается вернуть не тот тип, который обещала, PHP или попытается это как-то преобразовать (если ты лох и не включил строгий режим), или выебет тебе мозг исключением.
declare(strict_types=1); // Вот это включает строгую проверку. Без этого — живёшь как в говне.
function getAge(): int {
return '25 years'; // Тут будет жесткий TypeError: "Верни int, уёбок, а не строку!"
}
function getAgeWithoutStrict(): int {
return '25'; // А тут, без strict_types, PHP сам додумается и приведёт строку к int. Вернёт 25. Но это пиздец как ненадёжно, чувак.
}
Итог, блядь: Указание типа возврата — это не прихоть, а необходимость. Это как поставить замок на дверь от распиздяев в твоём коде. Код становится самодокументирующимся, ошибки ловятся сразу, а не через месяц, и жить становится проще. Да, сначала непривычно, но потом — одни плюсы.