declare

(PHP 4, PHP 5, PHP 7, PHP 8)

declare 結(jié)構(gòu)用來(lái)設(shè)定一段代碼的執(zhí)行指令。declare 的語(yǔ)法和其它流程控制結(jié)構(gòu)相似:

declare (directive)
    statement

directive 部分允許設(shè)定 declare 代碼段的行為。目前只認(rèn)識(shí)三個(gè)指令:ticks(更多信息見(jiàn)下面 ticks 指令)、 encoding(更多信息見(jiàn)下面 encoding 指令)、 strict_types 指令 (更多信息見(jiàn)類(lèi)型聲明頁(yè)面 嚴(yán)格類(lèi)型 章節(jié))。

因?yàn)楸局噶钍窃谖募幾g時(shí)處理的,所以指令只接受字面量的值。 無(wú)法使用變量和常量。下面為你演示:

<?php
// 這樣是有效的:
declare(ticks=1);

// 這樣是無(wú)效的:
const TICK_VALUE 1;
declare(
ticks=TICK_VALUE);
?>

declare 代碼段中的 statement 部分將被執(zhí)行——怎樣執(zhí)行以及執(zhí)行中有什么副作用出現(xiàn)取決于 directive 中設(shè)定的指令。

declare 結(jié)構(gòu)也可用于全局范圍,影響到其后的所有代碼(但如果有 declare 結(jié)構(gòu)的文件被其它文件包含,則對(duì)包含它的父文件不起作用)。

<?php
// 兩者相等:

// 可以這樣用:
declare(ticks=1) {
    
// 這里寫(xiě)完整的腳本
}

// 也可以這樣用:
declare(ticks=1);
// 這里寫(xiě)完整的腳本
?>

Ticks

Tick(時(shí)鐘周期)是一個(gè)在 declare 代碼段中解釋器每執(zhí)行 N 條可計(jì)時(shí)的低級(jí)語(yǔ)句就會(huì)發(fā)生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 來(lái)指定的。

不是所有語(yǔ)句都可計(jì)時(shí)。通常條件表達(dá)式和參數(shù)表達(dá)式都不可計(jì)時(shí)。

在每個(gè) tick 中出現(xiàn)的事件是由 register_tick_function() 來(lái)指定的。更多細(xì)節(jié)見(jiàn)下面的例子。注意每個(gè) tick 中可以出現(xiàn)多個(gè)事件。

示例 #1 Tick 的用法示例

<?php

declare(ticks=1);

// 每次 tick 事件都會(huì)調(diào)用該函數(shù)
function tick_handler()
{
    echo 
"tick_handler() called\n";
}

register_tick_function('tick_handler'); // 引起 tick 事件

$a 1// 引起 tick 事件

if ($a 0) {
    
$a += 2// 引起 tick 事件
    
print($a); // 引起 tick 事件
}

?>

參見(jiàn) register_tick_function()unregister_tick_function()。

Encoding

可以用 encoding 指令來(lái)對(duì)每段腳本指定其編碼方式。

示例 #2 對(duì)腳本指定編碼方式

<?php
declare(encoding='ISO-8859-1');
// 在這里寫(xiě)代碼
?>

警告

當(dāng)和命名空間結(jié)合起來(lái)時(shí) declare 的唯一合法語(yǔ)法是 declare(encoding='...');,其中 ... 是編碼的值。而 declare(encoding='...') {} 將在與命名空間結(jié)合時(shí)產(chǎn)生解析錯(cuò)誤。

參見(jiàn) zend.script_encoding