Зачем сделали это ограничение? Всегда сталкиваюсь с проблемами, связанными с этим, а плюсов за 2 года работы так и не нашёл. Просто интересно, зачем же всё-таки это сделали?
для начала вам надо разобраться что такое куки. Как куки передаются на клиент. Что такое заголовки и тело HTTP запросов и ответов. И тогда все встанет на свои места. Ну а что бы небыло проблем - почитать про управление буферизацией вывода в PHP.
В дополнение к ответу Сергей Протько скажу, что создавать их можно когда угодно. А вот устанавливать (отправлять) - только перед отправкой тела ответа.
Кстати, такие вещи как Symfony HTTPFoundation и PSR-7 как раз отчасти созданы для того, чтобы не простреливать себе ногу подобным образом.