enddeclare
Как PHP enddeclare закрывает блок declare() в альтернативном синтаксисе с двоеточием: примеры с ticks и частые ошибки.
Введение
enddeclare — это закрывающее ключевое слово для блока declare(), написанного в альтернативном синтаксисе PHP — форме с двоеточием, которую PHP предлагает в качестве замены фигурным скобкам. Так же как if: закрывается через endif, а foreach: — через endforeach, конструкция declare(...): закрывается через enddeclare;.
На этой странице рассказывается, что именно делает данное ключевое слово, с какой директивой оно реально применяется (ticks), какой синтаксис принимает PHP и какие ошибки приводят к синтаксической ошибке.
Когда на самом деле нужен enddeclare
Директива declare() задаёт поведение выполнения для определённого участка кода. Существуют три директивы: ticks, strict_types и encoding. Из них:
strict_typesиencodingдолжны быть самым первым выражением в файле и используют форму оператораdeclare(strict_types=1);— они не имеют блока и поэтому никогда не используютenddeclare.ticks— единственная директива, действие которой естественным образом ограничено блоком операторов, поэтому именно с ней используется альтернативный синтаксис иenddeclare.
На практике это означает: enddeclare нужен тогда, когда вы хотите блок ticks и предпочитаете синтаксис с двоеточием вместо фигурных скобок. В современном коде это встречается редко — именно поэтому стоит чётко знать этот синтаксис.
Синтаксис
Альтернативная форма заменяет открывающую { двоеточием, а закрывающую } — конструкцией enddeclare;:
declare(directive=value):
// statements
enddeclare;Эквивалентная форма с фигурными скобками:
declare(directive=value) {
// statements
}Обе формы взаимозаменяемы. Обратите внимание: запись
declare(...) { ... } enddeclare;(фигурные скобки иenddeclare) недопустима —enddeclareотносится только к форме с двоеточием. Смешивание форм является синтаксической ошибкой.
Пример: блок ticks, закрытый через enddeclare
Тик — это событие, которое PHP генерирует каждые N низкоуровневых операторов, выполненных внутри блока declare(ticks=N). Регистрация обработчика через register_tick_function() позволяет выполнять код при каждом тике — удобно для лёгкого профилирования или хуков, похожих на сигналы.
<?php
$ticks = 0;
register_tick_function(function () use (&$ticks) {
$ticks++;
});
declare(ticks=1):
$x = 1;
$y = 2;
$z = $x + $y;
enddeclare;
echo "Result: $z\n";
echo "Ticks fired: $ticks\n";Вывод:
Result: 3
Ticks fired: 3Обработчик срабатывает один раз для каждого оператора внутри блока (три присваивания → три тика). Код за пределами блока declare(...): ... enddeclare; тики не вызывает.
Распространённые ошибки
Не смешивайте фигурные скобки с enddeclare
Это самая частая ошибка (и то, что неправильно описано в старых руководствах):
// ❌ Parse error: unexpected token "enddeclare"
declare(ticks=1) {
// ...
} enddeclare;Выбирайте один стиль — либо { ... }, либо : ... enddeclare;.
Не используйте enddeclare со strict_types или encoding
declare(strict_types=1) и declare(encoding='UTF-8') — это директивы уровня файла, которые не принимают блок, поэтому enddeclare нечего закрывать:
<?php
declare(strict_types=1); // statement form — no block, no enddeclarestrict_types должна быть первым оператором в файле; размещение её после любого вывода или кода является фатальной ошибкой.
Для каждого declare(...): должен быть ровно один enddeclare;
Как и все ключевые слова альтернативного синтаксиса, открытый блок declare(...): должен быть закрыт ровно одним enddeclare;. Если забыть его, блок останется незакрытым и PHP сообщит об ошибке «unexpected end of file».
Заключение
enddeclare закрывает блок declare(...):, написанный в альтернативном синтаксисе PHP. Единственная директива, с которой его реально применяют, — это ticks, поскольку strict_types и encoding являются операторами уровня файла без блока. Держите двоеточие и enddeclare; вместе и никогда не смешивайте их с фигурными скобками — тогда это ключевое слово будет работать предсказуемо.
Полную информацию о директивах выполнения смотрите в declare; об альтернативном синтаксисе с двоеточием в управляющих структурах — в PHP Syntax.