declare

(PHP 4, PHP 5, PHP 7)

L'élément de langage declare sert à ajouter des directives d'exécutions dans un bloc de code. La syntaxe de declare est similaire à la syntaxe des autres fonctions de contrôle :

declare (directive)
    commandes

L'expression directive permet de contrôler l'intervention du bloc declare. Actuellement, seulement trois directives sont reconnues : la directive ticks (voir plus bas pour plus de détails sur les ticks), la directive d'encodage encoding (Voir plus bas pour plus de détails sur la directive encoding) et la directive strict_types (Voir la section Typage strict sur la page arguments de la fonction).

Version Description
7.0.0 Ajout de la directive strict_types
7.0.0 La directive ticks ne fuit plus dans des unités de compilation différentes.
5.3.0 Ajout de la directive encoding

Comme les directives sont gérées lors de la compilation du fichier, seulement les litéraux peuvent être utilisés comme valeur de ces directives. Les variables et constantes ne peuvent pas être utilisées. Pour illustrer :

<?php
// Ceci est correct:
declare(ticks=1);

// Ceci est incorrect:
const TICK_VALUE 1;
declare(
ticks=TICK_VALUE);
?>

L'expression commandes du bloc de declare sera exécutée. Comment elle sera exécutée, et quels effets cela aura, dépend de la directive utilisée dans le bloc directive.

La structure declare peut aussi être utilisée dans le contexte global. Elle affecte alors tout le code qui la suit (même si le fichier avec declare a été inclus après, ça n'affecte pas le fichier parent).

<?php
// Ces déclarations sont identiques.

// Vous pouvez utiliser ceci
declare(ticks=1) {
    
// script entier ici
}

// ou ceci
declare(ticks=1);
// script entier ici
?>

Ticks

Un tick est un événement qui intervient toutes les N commandes bas niveau tickables, exécutées par l'analyseur dans le bloc de declare. La valeur de N est spécifiée par la syntaxe ticks=N dans le bloc de directive declare.

Toutes les commandes ne sont pas tickables. Typiquement, les expressions de condition et les expressions d'arguments ne sont pas tickables.

Un événement qui intervient à chaque tick est spécifié avec la fonction register_tick_function(). Reportez-vous à l'exemple ci-dessous pour plus de détails. Notez que plus d'un événement peut intervenir par tick.

Exemple #1 Exemple d'utilisation des ticks

<?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);
}

?>

Exemple #2 Exemple d'utilisation des ticks

<?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();

?>

Voir aussi register_tick_function() et unregister_tick_function().

L'encodage

L'encodage d'un script peut être spécifié par script en utilisant la directive encoding.

Exemple #3 Déclaration d'un encodage pour un script

<?php
declare(encoding='ISO-8859-1');
// le code
?>

Attention

Combinée avec les espaces de nommage, la seule syntaxe valable pour declare est declare(encoding='...');... est la valeur de l'encodage. declare(encoding='...') {} soulèvera une erreur d'interprétation dans le cas des espaces de nommage.

La valeur d'encodage est ignorée en PHP 5.3 à moins que PHP soit compilé avec --enable-zend-multibyte.

Notez que PHP ne vous renseignera sur l'activation ou non de --enable-zend-multibyte qu'au moyen de phpinfo().

Voir aussi zend.script_encoding.