Problema com cabeçalhos de resposta HTTP em PHP

De acordo com as regras do HTTP, primeiro são enviados os cabeçalhos HTTP e depois o corpo da resposta HTTP. Por isso, trabalhar com a função header no PHP tem suas particularidades.

O problema é que se houver qualquer saída para a tela antes da chamada desta função, ela será interpretada como o início do corpo da resposta. Nesse caso, a chamada da função header levará a um aviso do PHP com o texto headers already sent (cabeçalhos já enviados). Mesmo assim, os cabeçalhos podem até ser enviados. Pode ser que o erro nem seja exibido (dependendo das configurações do PHP). Mas, na maioria das vezes, isso só acontecerá no ambiente local, e quando o site for publicado na internet, tudo quebrará.

Por saída para a tela entende-se qualquer texto. Por exemplo, assim:

phptexto
<?php
  header('Content-Type: text/html');
?>

Ou uma linha vazia:

php     
<?php
  header('Content-Type: text/html');
?>

Ou um espaço:

php <?php
  header('Content-Type: text/html');
?>

Ou uma tag:

html<div>
  <?php
    header('Content-Type: text/html');
  ?>
</div>

Ou saída via echo:

php<?php
  echo 'abc';
  header('Content-Type: text/html');
?>

Ou saída via var_dump:

php<?php
  $str = 'abc';
  var_dump($str);
  
  header('Content-Type: text/html');
?>

Até mesmo avisos do PHP serão saídas para a tela. No exemplo a seguir, há intencionalmente um acesso a uma variável inexistente, o que levará à saída de um aviso:

php<?php
  $text += 1;
  header('Content-Type: text/html');
?>

A quebra das tags PHP também gera saída para a tela:

php<?php
  echo 'abc';
?>
<?php
  header('Content-Type: text/html');
?>
Задание 1

Crie intencionalmente uma saída para a tela antes da função header. Estude o texto do erro que surge.

Задание 2

Corrija o erro cometido neste código:

html<!DOCTYPE html>
<html>
  <head>
    <?php
      header('Content-Type: text/html');
    ?>
  </head>
  <body>
    texto
  <body>
<html>