Problém s hlavičkami HTTP odpovědi v PHP

Podle pravidel HTTP se nejprve odesílají HTTP hlavičky a poté tělo HTTP odpovědi. Kvůli tomu má práce s funkcí header v PHP svá specifika.

Problém je v tom, že pokud před voláním této funkce bude nějaký výstup na obrazovku, bude interpretován jako začátek těla odpovědi. V tomto případě volání funkce header povede k varování PHP s textem headers already sent. Přitom se hlavičky mohou i odeslat. Může se dokonce nestat ani chyba (záleží na nastavení PHP). Ale většinou to bude pouze na lokálním prostředí, a při nasazení webu na internet se vše rozbije.

Pod výstupem na obrazovku se rozumí jakýkoli text. Například takto:

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

Nebo prázdný řádek:

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

Nebo mezera:

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

Nebo tag:

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

Nebo výstup pomocí echo:

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

Nebo výstup pomocí var_dump:

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

I varování PHP budou výstupy na obrazovku. V následujícím příkladu je záměrně přistoupeno k neexistující proměnné, což povede k výpisu varování:

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

I přerušení PHP závorek také generuje výstup na obrazovku:

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

Záměrně vytvořte výstup na obrazovku před funkcí header. Prostudujte text vzniklé chyby.

Задание 2

Opravte chybu, která byla provedena v tomto kódu:

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