Problema cu antetele HTTP de răspuns în PHP

Conform regulilor HTTP, mai întâi se trimit antetele HTTP, iar apoi corpul răspunsului HTTP. Din această cauză, lucrul cu funcția header în PHP are particularități specifice.

Problema este că, dacă înainte de apelarea acestei funcții există vreo ieșire pe ecran, aceasta va fi interpretată ca începutul corpului răspunsului. În acest caz, apelul funcției header va duce la o avertizare PHP cu textul headers already sent. În acest caz, antetele s-ar putea totuși să fie trimise. Se poate chiar ca eroarea să nu fie afișată (depinde de setările PHP). Dar cel mai adesea acest lucru se va întâmpla doar pe mediul local, iar la publicarea site-ului pe internet totul se va strica.

Prin ieșire pe ecran se înțelege orice text. De exemplu, așa:

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

Sau un rând gol:

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

Sau un spațiu:

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

Sau un tag:

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

Sau ieșire prin echo:

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

Sau ieșire prin var_dump:

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

Chiar și avertismentele PHP vor fi ieșiri pe ecran. În următorul exemplu se accesează intenționat o variabilă inexistentă, ceea ce va duce la afișarea unui avertisment:

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

Închiderile și deschiderile tag-urilor PHP generează de asemenea ieșire pe ecran:

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

Creați intenționat o ieșire pe ecran înaintea funcției header. Studiați textul erorii care apare.

Задание 2

Corectați eroarea făcută în acest cod:

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