PHP 8.4.0 RC4 available for testing

Sintaxe

As constantes podem ser definidas usando a palavra-chave const ou usando a função define(). Enquanto define() permite que uma constante seja definida usando uma expressão arbitrária, a palavra-chave const possui restrições, conforme descrito no próximo parágrafo. Uma vez definida, a constante nunca poderá ser modificada ou anulada.

Ao usar a palavra-chave const, somente expressões escalares (bool, int, float e string) e arrays constantes contendo apenas expressões escalares são aceitos. É possível definir constantes como um resource, mas isso deve ser evitado, pois pode causar resultados inesperados.

O valor de uma costante é acessado simplesmente informando seu nome. Ao contrário das variáveis, uma constante não é precedida por um $. Também é possível usar a função constant() para ler o valor de uma constante se o nome da constante for obtido dinamicamente. Use get_defined_constants() para obter uma lista de todas as constantes definidas.

Nota: As constantes e variáveis (globais) estão em espaços de nomes diferentes. Isso implica que, por exemplo, true e $TRUE são geralmente diferentes.

Se uma constante indefinida for usada, um erro Error será lançado. Antes do PHP 8.0.0, constantes indefinidas eram interpretadas como uma simples string, ou seja, CONSTANTE vs. "CONSTANTE". Esse mecanismo alternativo foi descontinuado a partir do PHP 7.2.0 e um alerta de nível E_WARNING será lançado quando isso acontecer. Antes do PHP 7.2.0, um erro de nível E_NOTICE era lançado. Veja também por que $foo[bar] é errado (a não ser que bar seja uma constante). Isso não se aplica às constantes (totalmente) qualificadas, que sempre lançarão um Error se forem indefinidas.

Nota: Para verificar se uma constante está definida, use a função defined().

Estas são as diferenças entre constantes e variáveis:

  • Constantes não têm um cifrão ($) antes delas;
  • Constantes podem ser definidas e acessadas em qualquer lugar sem considerar as regras de escopo de variáveis;
  • Constantes não podem ser redefinidas ou anuladas depois de definidas; e
  • Constantes só podem ter valores escalares ou arrays.

Exemplo #1 Definindo Constantes

<?php
define
("CONSTANTE", "Olá Mundo.");
echo
CONSTANTE; // imprime "Olá Mundo."
echo Constante; // Lança um erro Error: Undefined constant "Constante"
// Antes do PHP 8.0.0, imprime "Constante" e emite um aviso.
?>

Exemplo #2 Definindo Constantes usando a palavra-chave const

<?php
// Valor escalar simples
const CONSTANTE = 'Olá Mundo';

echo
CONSTANTE;

// Expressão escalar
const OUTRA_CONSTANTE = CONSTANTE . '; Adeus Mundo';
echo
OUTRA_CONSTANTE;

const
ANIMAIS = array('cachorro', 'gato', 'pássaro');
echo
ANIMAIS[1]; // imprime "gato"

// Array constante
define('ANIMAIS', array(
'cachorro',
'gato',
'pássaro'
));
echo
ANIMAIS[1]; // imprime "gato"
?>

Nota:

Ao contrário das constantes definidas usando define(), as constantes definidas usando a palavra-chave const devem ser declaradas no escopo mais externo porque são definidas em tempo de compilação. Isto significa que constantes não podem ser declaradas dentro de funções, loops, declarações if ou blocos try/catch.

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
31
souzanicolas87 at gmail dot com
2 years ago
the documentation doesn't go too far in explaining the crucial difference between the two ways of declaring constants in PHP.

Const is handled at compile time, define() at run time. For this reason, a constant cannot be conditionally defined using Const, for example.

Another difference we can notice occurs in the constant declarations in classes. Const infiltrates the class scope, while define() leaks into the global scope.

<?php

Class Myclass (){
const
NAME = "Nicolas";
}

?>

The NAME constant is within the scope of the MyClass class.
up
8
login at (two)view dot de
7 years ago
Just a quick note:
From PHP7 on you can even define a multidimensional Array as Constant:

define('QUARTLIST',array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul'));

does work as expected.
To Top