Как использовать return вместо echo

Начал изучать php фреймворк laravel и обратил внимание, что для вывода текста достаточно писать:

return "Hello World!";

вместо аналогичного на php:

echo "Hello World!";

Как это работает? Сначала думал, что это делается каким-то хитрым способом через буфер, например:

ob_start();

function my() {
    return "Hello World!";
}

my();

ob_get_contents();

Но такой вариант не работает. Как это работает?


Ответы (2 шт):

Автор решения: Eugene X

Как вы молодёжь любите себе жизнь усложнять :)

Открываем документацию : https://laravel.su/docs/8.x/responses

И что мы там видим :

Все маршруты и контроллеры должны возвращать ответ, который будет отправлен обратно в браузер пользователя. Laravel предлагает несколько разных способов вернуть ответы. Самый простой ответ – это возврат строки из маршрута или контроллера. Фреймворк автоматически преобразует строку в полный HTTP-ответ:

Route::get('/', function () {
    return 'Hello World';
});

(!!!) Все маршруты и контроллеры должны возвращать ответ, который будет отправлен обратно в браузер пользователя. (!!!)

Никаких вам echo! Забудьте! Вы ломаете все механизмы Response, Хуков и Middleware!!!

Если вы хотите выводить HTML то используйте Blade https://laravel.su/docs/8.x/blade

Если лезь глубоко под капот, то по факту твоя строка преобразуется в

Illuminate\Support\Stringable

А от туда уже создаёться объект Illuminate\Http\Response

$response = new Response($response->__toString(), 200, ['Content-Type' => 'text/html']);

Всё это описано в классе: Illuminate\Routing\Router в методе toResponse

→ Ссылка
Автор решения: Антон

Возможно, кому-то это будет полезно. Для реализации необходимо записывать данные в поток OutputStream. Здесь можно ознакомиться с потоками ввода / вывода (https://www.php.net/manual/ru/wrappers.php.php).

Теперь к самой реализации.

/**
*   Здесь может быть функция или метод класса
*/
function test() {
    return "Hello World!";
}

/**
*   Открываем поток OutputStream для записи данных
*/
$outputStream = fopen('php://output', 'a');

/**
*   Отправляем http код ответа (в данном случае это будет статус 200 - ОК)
*/
http_response_code(200);

/**
*   Устанавливаем заголовок, чтобы данные отображались в html
*/
header('Content-Type: text/html');

/**
*   Записываем данные в поток вывода (OutputStream)
*   в нашем случае передаем вторым аргументом нашу функцию
*/
fwrite($outputStream, test());

/**
*   Закрываем поток для записи
*/
fclose($outputStream);

Получаем результат на странице

Hello World!
→ Ссылка