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>