Forum und email

declare

O construtor declare é utilizado para configurar diretivas de execução para blocos de código. A sintaxe do declare é similar a sintaxe de outros construtores de controle.

declare (diretiva)
  instrucao

A seção diretiva permite o comportamento do bloco declare a ser configurado. Atualmente somente uma diretiva é reconhecida: a diretiva ticks. (veja abaixo para maiores informações em diretiva ticks)

A parte instrucao do bloco declare será executada. Como ela é executada e que efeitos colaterais que podem ocorrem durante a execução dependem da configuração diretiva.

O construtor declare também pode ser utilizado no escopo global, afetando todo o código que se seguir.

<?php
// isso eh o mesmo:

// voce pode fazer isso:
declare(ticks=1) {
    
// script inteiro aqui
}

// ou pode fazer isto:
declare(ticks=1);
// sctipt inteiro aqui
?>

Ticks

Um tick é um evento que ocorre para cada N níveis de instruções executados pelo interpretador com o bloco declare. O valor para N é especificado utilizando ticks=N nos blocos declare das seções diretiva.

O(s) evento(s) que ocorre(m) em cada tick são especificados utilizando register_tick_function(). Veja o exemplo abaixo para maiores detalhes. Note que mais de um evento pode ocorrer em cada tick.

Example#1 Histórico de um trecho de código PHP

<?php
// Uma função que grava o tempo entre as chamadas
function profile ($dump FALSE)
{
    static 
$profile;

    
// Retorna os tempos preservados no histórico, então apaga
    
if ($dump) {
        
$temp $profile;
        unset (
$profile);
        return 
$temp;
    }

    
$profile[] = microtime ();
}

// Ativa o manipulador do tick
register_tick_function("profile");

// Inicializa a função antes de declarar o bloco
profile();

// Roda um trecho de código, disparando um tick a cada duas instruções
declare(ticks=2) {
    for (
$x 1$x 50; ++$x) {
        echo 
similar_text(md5($x), md5($x*$x)), "<br />;";
    }
}

// Mostra os dados guardados no histórico
print_r(profile (TRUE));
?>
No exemplo acima, o bloco 'declare' grava os tempos a cada segundo nível dentro das instruções no bloco enquanto executam. Esta informação pode ser utilizada para encontrar áreas lentas em segmentos particulares de código. Este processo pode ser realizado de outras formas, mas a utilização de ticks é mais conveniente e fácil de implementar.

Ticks são idealizados para debug, implementação de multitask simples, processos de I/O em background e afins.

Veja também: register_tick_function() e unregister_tick_function().