HTTP atsakymo antraščių problema PHP

Pagal HTTP taisykles pirmiausia siunčiamos HTTP antraštės, o po to HTTP atsakymo korpusas. Dėl to darbas su funkcija header PHP turi savo ypatumų.

Faktas yra tas, kad jei prieš iškvietus šią funkciją bus kokia nors išvestis į ekraną, ji bus traktuojama kaip atsakymo korpuso pradžia. Tokiu atveju šios funkcijos header iškvietimas privers PHP įspėjimą su tekstu headers already sent. Tuomet antraštės gali net būti išsiųstos. Gali net ir klaida neišsijungti (priklauso nuo PHP nustatymų). Tačiau dažniausiai tai bus tik vietiniame serveryje, o įkėlus svetainę į internetą viskas sulūš.

Išvestimi į ekraną suprantamas bet koks tekstas. Pavyzdžiui, taip:

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

Arba tuščia eilutė:

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

Arba tarpas:

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

Arba tagas:

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

Arba išvestis per echo:

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

Arba išvestis per var_dump:

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

Net PHP įspėjimai bus išvestimi į ekraną. Šiame pavyzdyje tyčia kreipiamasi į neegzistuojančią kintamąjį, kas sukels įspėjimo išvedimą:

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

PHP skliaustų pertraukos taip pat sukuria išvestį į ekraną:

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

Sąmoningai sukurkite išvestį į ekraną prieš funkciją header. Išnagrinėkite atsirandančios klaidos tekstą.

Задание 2

Ištaisykite klaidą, padarytą šiame kode:

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