declare 構造は、コードの実行命令を設定するために使用されます。 declare の構文は他のフロー制御構造と似ています。
declare (directive) statement
ディレクティブ部分では、declare セクションの動作を設定できます。現在、知られている命令はティックとエンコーディングの 2 つだけです。
注: エンコーディングは PHP 5.3.0 の新しいコマンドです。
宣言コードセグメントのステートメント部分が実行されます。どのように実行されるか、実行中にどのような副作用が発生するかは、ディレクティブで設定された命令によって異なります。
宣言構造はグローバル スコープでも使用でき、後続のすべてのコードに影響します (ただし、宣言構造を持つファイルが他のファイルにインクルードされている場合、それを含む親ファイルには影響しません)。
<?php // these are the same: // you can use this: declare(ticks=1) { // entire script here } // or you can use this: declare(ticks=1); // entire script here ?>
Ticks
Tick (クロック サイクル) は、インタプリタが宣言コード セグメント内の N 個の時間指定可能な低レベル ステートメントを実行するたびに発生するイベントです。 Nの値はdeclareのディレクティブ部分のticks=Nで指定します。
すべてのステートメントに時間を設定できるわけではありません。通常、条件式とパラメータ式は時間指定できません。
各ティックで発生するイベントは register_tick_function() で指定されます。詳細については、以下の例を参照してください。各ティックで複数のイベントが発生する可能性があることに注意してください。
例 #1 Tick の使用例
<?php declare(ticks=1); // A function called on each tick event function tick_handler() { echo "tick_handler() called\n"; } register_tick_function('tick_handler'); $a = 1; if ($a > 0) { $a += 2; print($a); } ?>
例 #2 Tick の使用例
<?php function tick_handler() { echo "tick_handler() called\n"; } $a = 1; tick_handler(); if ($a > 0) { $a += 2; tick_handler(); print($a); tick_handler(); } tick_handler(); ?>
register_tick_function() と unregister_tick_function() を参照してください。
エンコーディング
エンコーディング ディレクティブを使用して、各スクリプトのエンコーディング方法を指定できます。
例 #3 スクリプトのエンコード方法を指定します
declare(encoding='ISO-8859-1');
// code here
?>
名前空間と組み合わせる場合の宣言の注意唯一の有効な構文は、declare(encoding='...'); です。ここで、... はエンコードされた値です。また、declare(encoding='...') {} を名前空間と組み合わせると解析エラーが発生します。
PHP 5.3 では、コンパイル時に --enable-zend-multibyte が指定されない限り、declare のエンコーディング値は無視されます。
phpinfo() が使用されない限り、PHP はコンパイル中に --enable-zend-multibyte が指定されたかどうかを表示しないことに注意してください。