Как работает отправка заголовков в PHP?
ответ состоит из заголовков и содержимого. и именно в таком порядке.заголовок1
заголовок2
.....
заголовокX

данныепоэтому если начался вывод данных, заголовок уже не отправить.

и это не конкретно PHP,  так работает HTTP.
Можно добиться того что описали в п.1 если в начале скрипта добавить ob_start();

<?php
ob_start();

echo '123';
header('Content-Type: text/html');
echo '345';

в данном случае ob_start() буфферизирует любой вывод и не посылает его (в обработчик на стороне веб-сервера) до окончания работы скрипта, а все header() отправляются сразу же.

p.s. предупреждаю что приведённый выше пример не рекомендуется к использованию и может привести к появлению трудноуловимых багов. И лучше организовывать свой код так чтобы любой вывод приложения логически шёл в конце, после отправки всех нужных header'ов.