W3docs

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 enddeclare

strict_types должна быть первым оператором в файле; размещение её после любого вывода или кода является фатальной ошибкой.

Для каждого declare(...): должен быть ровно один enddeclare;

Как и все ключевые слова альтернативного синтаксиса, открытый блок declare(...): должен быть закрыт ровно одним enddeclare;. Если забыть его, блок останется незакрытым и PHP сообщит об ошибке «unexpected end of file».

Заключение

enddeclare закрывает блок declare(...):, написанный в альтернативном синтаксисе PHP. Единственная директива, с которой его реально применяют, — это ticks, поскольку strict_types и encoding являются операторами уровня файла без блока. Держите двоеточие и enddeclare; вместе и никогда не смешивайте их с фигурными скобками — тогда это ключевое слово будет работать предсказуемо.

Полную информацию о директивах выполнения смотрите в declare; об альтернативном синтаксисе с двоеточием в управляющих структурах — в PHP Syntax.

Практика

Практика
Каков правильный способ завершить оператор declare в PHP?
Каков правильный способ завершить оператор declare в PHP?
Was this page helpful?