HTTP պատասխանի վերնագրերի խնդիրը PHP-ում

HTTP կանոններով նախ ուղարկվում են HTTP վերնագրերը, ապա՝ HTTP պատասխանի մարմինը: Սրա պատճառով PHP-ի header ֆունկցիայի հետ աշխատանքն ունի իր առանձնահատկությունները:

Բանը նրանում է, որ եթե այս ֆունկցիան կանչելուց առաջ էկրանին ինչ-որ արտածում կլինի, այն կմեկնաբանվի որպես պատասխանի մարմնի սկիզբ: Այս դեպքում header ֆունկցիայի կանչը կհանգեցնի PHP-ի նախազգուշացման՝ headers already sent տեքստով: Այդ դեպքում վերնագրերը գուցե նույնիսկ ուղարկվեն: Նույնիսկ գուցե սխալը չարտածվի (կախված է PHP-ի կարգավորումներից): Բայց ամենից հաճախ դա տեղի կունենա միայն լոկալ մեքենայում, իսկ կայքը ինտերնետում տեղադրելու դեպքում ամեն ինչ կվերանա:

Էկրանին արտածում ասելով նկատի է ունեցվում ցանկացած տեքստ: Օրինակ, այսպես.

phpտեքստ
<?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>
    տեքստ
  <body>
<html>