ob_start 函数的用法

usage of ob_start function

我正在学习本教程 https://symfony.com/doc/current/create_framework/front_controller.html 我有一个关于此 php 代码

的简单问题
 // example.com/web/front.php
require_once __DIR__.'/../vendor/autoload.php';

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$request = Request::createFromGlobals();
$response = new Response();

$map = [
    '/hello' => __DIR__.'/../src/pages/hello.php',
    '/bye'   => __DIR__.'/../src/pages/bye.php',
];

$path = $request->getPathInfo();
if (isset($map[$path])) {
    ob_start();
    include $map[$path];
    $response->setContent(ob_get_clean());
} else {
    $response->setStatusCode(404);
    $response->setContent('Not Found');
}

$response->send();

代码在没有缓冲输出的情况下工作(没有 ob_ calls ...),所以我的问题是为什么?

输出缓冲接受 echoob_start()ob_get_clean() 之间(或其他输出缓冲结束)的内容,并防止它 "early leaking" 进入 php 服务于用户。

如果去掉输出缓冲,响应的内容只是输出"conventionally",但是$responseobject会是空的,$reponse->send()会失败,因为你已经输出了其他东西,所以headers不能再发送了。

所以,它有效,因为您要么直接发送输出(php 的默认操作模式),要么缓冲输出并通过响应 [=] 发送输出 "indirectly" 31=](或仅输出 ob_get_clean 的 return 值)。

在我看来,主要区别在于框架的东西,可能会或可能不会向响应添加一些实用程序,不能再做任何事情,因为框架不知道你发送了什么输出。例如,完整的 symfony 框架在底部显示一个分析器栏,它肯定是通过将​​其注入响应来实现的。通过绕过 $response object,你也拒绝了注入。但是,在您的特定情况下,这可能根本无关紧要。