Masalah dengan Penghantaran Header HTTP dalam PHP

Menurut peraturan HTTP, header HTTP dihantar terlebih dahulu, diikuti dengan badan (body) respons HTTP. Oleh sebab itu, penggunaan fungsi header dalam PHP mempunyai ciri-ciri tersendiri.

Masalahnya ialah, jika terdapat sebarang output ke skrin sebelum fungsi ini dipanggil, ia akan ditafsirkan sebagai permulaan badan respons. Dalam kes ini, panggilan kepada fungsi header akan menyebabkan amaran PHP dengan teks headers already sent. Header mungkin masih dihantar. Ralat mungkin tidak dipaparkan (bergantung pada konfigurasi PHP). Tetapi selalunya ini hanya berlaku dalam persekitaran pembangunan tempatan (local), dan apabila laman web dinaikkan ke internet, semuanya akan rosak.

Output ke skrin merujuk kepada sebarang teks. Contohnya:

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

Atau baris kosong:

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

Atau ruang (space):

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

Atau tag:

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

Atau output melalui echo:

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

Atau output melalui var_dump:

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

Malah amaran PHP juga dianggap sebagai output ke skrin. Dalam contoh berikut, sengaja mengakses pembolehubah yang tidak wujud, yang akan menyebabkan output amaran:

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

Pemisahan tag PHP juga menghasilkan output ke skrin:

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

Sengaja cipta output ke skrin sebelum fungsi header. Kaji teks ralat yang timbul.

Задание 2

Betulkan ralat yang dilakukan dalam kod ini:

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