Problem z nagłówkami odpowiedzi HTTP w PHP

Zgodnie z zasadami HTTP najpierw wysyłane są nagłówki HTTP, a potem ciało odpowiedzi HTTP. Z tego powodu praca z funkcją header w PHP ma swoje specyficzne cechy.

Chodzi o to, że jeśli przed wywołaniem tej funkcji nastąpi jakieś wyjście na ekran, będzie ono traktowane jako początek ciała odpowiedzi. W tym przypadku wywołanie funkcji header doprowadzi do ostrzeżenia PHP z tekstem headers already sent. W tym przypadku nagłówki mogą nawet zostać wysłane. Może nawet błąd nie zostanie wyświetlony (zależy to od ustawień PHP). Ale najczęściej będzie to tylko na lokalnym serwerze, a po opublikowaniu strony w internecie wszystko się zepsuje.

Przez wyjście na ekran rozumie się dowolny tekst. Na przykład tak:

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

Lub pusty wiersz:

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

Lub spacja:

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

Lub tag:

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

Lub wyjście przez echo:

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

Lub wyjście przez var_dump:

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

Nawet ostrzeżenia PHP będą wyjściami na ekran. W następnym przykładzie celowo następuje odwołanie do nieistniejącej zmiennej, co doprowadzi do wyjścia ostrzeżenia:

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

Przerwania nawiasów PHP również generują wyjście na ekran:

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

Celowo stwórz wyjście na ekran przed funkcją header. Przeanalizuj tekst powstałego błędu.

Задание 2

Popraw błąd popełniony w tym kodzie:

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