declare 命令は、あるコードブロックの中に 実効命令をセットするために使用されます。declare の文法は他の制御構造と似ています。
declare (命令) 文
命令の箇所で、セットされた declareブロックの挙動を指定することが出来ます。 現在のところ、使用できる命令は ticks ( ticksに関しては以下を参照してください) と encoding (encoding に関しては以下を参照ください) です。
注意: encoding ディレクティブは PHP 5.3.0 で追加されました。
declareブロックの文 の実行のされ方や実行時にどのような作用が起こるかについては 命令に何が指定されたかに依存します。
declare構造はグローバルスコープしても使用され、 それはそれ以降のコード上の全てにおいて影響します (しかし、declare を含むファイルがインクルードされた場合は、 親ファイルにはその影響は及びません)。
<?php
// 以下は同じ意味です
// こうすることもできますし、
declare(ticks=1) {
// ここにすべてのスクリプトを書きます
}
// こうすることもできます
declare(ticks=1);
// ここにすべてのスクリプトを書きます
?>
PHP 5.3.0 で tick は非推奨となりました。 PHP 6.0.0 で削除される予定です。
tickとはdeclareブロックの実行中にパーサが N個の低レベル命令を実行するごとに 発生するイベントのことです。Nの値は declareブロックの命令の箇所で ticks=Nのように 指定します。
tickごとに発生させるイベントはregister_tick_function() を使用して指定します。詳細は以下の例を参照してください。1回のtickで 複数のイベントが起こり得ることに注意してください。
例1 PHPのコードの一部をプロファイルする
<?php
// 呼び出されるとその時間を記録する関数
function profile($dump = FALSE)
{
static $profile;
// 格納されたプロファイルを返し、その値を削除します
if ($dump) {
$temp = $profile;
unset($profile);
return $temp;
}
$profile[] = microtime();
}
// tickハンドラを設定します
register_tick_function("profile");
// declareブロックの前で初期化します
profile();
// 2命令ごとにtickを投げるように設定し、ブロックを実行します
declare(ticks=2) {
for ($x = 1; $x < 50; ++$x) {
echo similar_text(md5($x), md5($x*$x)), "<br />;";
}
}
// プロファイラに格納されたデータを表示します
print_r(profile(TRUE));
?>
この例では、'declare'ブロックのコード中で2個の低レベル 命令が実行されるごとにその時間を記録してプロファイルを 行っています。この情報はコードのあるセクションの中で 遅い箇所を探すのに使用できます。この処理は他の手法でも 使用できます。ticksを使用することで実装が簡単になる 場合が多々あるのです。
ticksはデバッグ、単純なマルチタスク処理、バックグラウンドI/Oや その他多くの処理を実装するのに便利です。
register_tick_function() および unregister_tick_function() も参照ください。
スクリプトのエンコーディングをスクリプトごとに指定するには encoding ディレクティブを使用します。
例2 スクリプトのエンコーディングの宣言
<?php
declare(encoding='ISO-8859-1');
// ここにコードを書きます
?>
名前空間と組み合わせて使用する場合、使用できる形式は declare(encoding='...'); のみです。... にエンコーディングを指定します。declare(encoding='...') {} は、名前空間と組み合わせるとパースエラーとなります。
php を --enable-zend-multibyte つきでコンパイルしていない場合、 PHP 5.3 では encoding 宣言は無視されます。 PHP 6.0 では、encoding 宣言を用いて スキャナにファイル作成時のエンコーディングを伝えます。使用できる値は、 たとえば UTF-8 のようなエンコーディング名です。