Težava z glavami HTTP odziva v PHP

Po pravilih HTTP se najprej pošljejo HTTP glave, nato pa telo HTTP odziva. Zaradi tega ima delo s funkcijo header v PHP svoje posebnosti.

Bistvo je v tem, da če je pred klicem te funkcije kakršen koli izpis na zaslon, bo ta obravnavan kot začetek telesa odziva. V tem primeru bo klic funkcije header povzročil opozorilo PHP z besedilom headers already sent. V tem primeru se glave morda celo pošljejo. Morda se celo napaka ne izpiše (odvisno od nastavitev PHP). Toda najpogosteje se bo to zgodilo samo na lokalnem okolju, ob objavi spletne strani na internet pa se bo vse pokvarilo.

Z izpisom na zaslon se misli poljubno besedilo. Na primer, takole:

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

Ali prazna vrstica:

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

Ali presledek:

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

Ali tag:

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

Ali izpis preko echo:

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

Ali izpis preko var_dump:

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

Celi opozorila PHP bodo izpisi na zaslon. V naslednjem primeru gre namerno do dostopa do neobstoječe spremenljivke, kar bo povzročilo izpis opozorila:

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

Tudi prelomi PHP oklepajev povzročajo izpis na zaslon:

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

Namerno ustvarite izpis na zaslon pred funkcijo header. Preučite besedilo nastale napake.

Задание 2

Popravite napako, storjeno v tej kodi:

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