Problém s hlavičkami HTTP odpovede v PHP

Podľa pravidiel HTTP sa najprv odosielajú HTTP hlavičky a potom telo HTTP odpovede. Kvôli tomu má práca s funkciou header v PHP svoje špecifiká.

Problém je v tom, že ak pred volaním tejto funkcie bude nejaký výstup na obrazovku, bude interpretovaný ako začiatok tela odpovede. V tomto prípade volanie funkcie header povedie k varovaniu PHP s textom headers already sent. V takom prípade sa hlavičky možno ani neodošlú. Možno ani chyba sa nezobrazí (závisí od nastavení PHP). Ale najčastejšie to bude len na lokálnom serveri, a pri nasadení stránky na internet sa všetko pokazí.

Pod výstupom na obrazovku sa rozumie akýkoľvek text. Napríklad takto:

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

Alebo prázdny riadok:

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

Alebo medzera:

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

Alebo tag:

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

Alebo výstup pomocou echo:

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

Alebo výstup pomocou var_dump:

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

Aj varovania PHP budú výstupmi na obrazovku. V nasledujúcom príklade sa zámerne pristupuje k neexistujúcej premennej, čo povedie k výstupu varovania:

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

Uzatvorenie PHP zátvoriek tiež spôsobuje výstup na obrazovku:

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

Zámerne vytvorte výstup na obrazovku pred funkciou header. Študujte text vzniknutej chyby.

Задание 2

Opravte chybu, ktorá bola urobená v tomto kóde:

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