Проблема со заглавките на 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>