Проблема с заголовками HTTP ответа в PHP

По правилам HTTP сначала отправляются HTTP заголовки, а потом тело HTTP ответа. Из-за этого работа с функцией header в PHP имеет свои особенности.

Дело в том, что если перед вызовом этой функции будет какой-то вывод на экран, он будет трактоваться как начало тела ответа. В этом случае вызов функции header приведет к предупреждению PHP с текстом headers already sent. При этом заголовки может даже и отправятся. Может даже и ошибка не выведется (зависит от настроек PHP). Но чаще всего это будет только на локалке, а при выкладке сайта в интернет все поломается.

Под выводом на экран подразумевается любой текст. Например, так:

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

Или пустая строка:

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

Или пробел:

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

Или тег:

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

Или вывод через echo:

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

Или вывод через var_dump:

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

Даже предупреждения PHP будут выводами на экран. В следующем примере намеренно идет обращение к несуществующей переменной, что приведет к выводу предупреждения:

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

Разрывы PHP скобок также пораждают вывод на экран:

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

Намеренно создайте вывод на экран перед функцией header. Изучите текст возникающей ошибки.

Задание 2

Исправьте ошибку, допущенную в этом коде:

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