privadas - usar constantes em php




define() vs const (7)

Pergunta bastante simples: Em PHP, quando você usa

define('FOO', 1);

e quando você usa

const FOO = 1;

Quais são as principais diferenças entre os dois?


A maioria dessas respostas está errada ou está contando apenas metade da história.

  1. Você pode escopo suas constantes usando namespaces.
  2. Você pode usar a palavra-chave "const" fora das definições de classe. No entanto, assim como nas classes, os valores atribuídos usando a palavra-chave "const" devem ser expressões constantes.

Por exemplo:

const AWESOME = 'Bob'; // Valid

Mau exemplo:

const AWESOME = whatIsMyName(); // Invalid (Function call)
const WEAKNESS = 4+5+6; // Invalid (Arithmetic) 
const FOO = BAR . OF . SOAP; // Invalid (Concatenation)

Para criar constantes variáveis ​​use define () assim:

define('AWESOME', whatIsMyName()); // Valid
define('WEAKNESS', 4 + 5 + 6); // Valid
define('FOO', BAR . OF . SOAP); // Valid

A partir do PHP 5.3, existem duas maneiras de definir constantes : usando a palavra-chave const ou usando a função define() :

const FOO = 'BAR';
define('FOO', 'BAR');

A diferença fundamental entre essas duas maneiras é que const define constantes em tempo de compilação, enquanto define define em tempo de execução. Isso causa a maioria das desvantagens do const . Algumas desvantagens de const são:

  • const não pode ser usado para definir as constantes de forma condicional. Para definir uma constante global, ela deve ser usada no escopo mais externo:

    if (...) {
        const FOO = 'BAR';    // invalid
    }
    // but
    if (...) {
        define('FOO', 'BAR'); // valid
    }

    Por que você quer fazer isso de qualquer maneira? Uma aplicação comum é verificar se a constante já está definida:

    if (!defined('FOO')) {
        define('FOO', 'BAR');
    }
  • const aceita um escalar estático (número, string ou outra constante como true , false , null , __FILE__ ), enquanto define() usa qualquer expressão. Já que expressões constantes do PHP 5.6 são permitidas em const também:

    const BIT_5 = 1 << 5;    // valid since PHP 5.6, invalid previously
    define('BIT_5', 1 << 5); // always valid
  • const toma um nome de constante simples, enquanto define() aceita qualquer expressão como nome. Isso permite fazer coisas assim:

    for ($i = 0; $i < 32; ++$i) {
        define('BIT_' . $i, 1 << $i);
    }
  • const s são sempre sensíveis a maiúsculas e minúsculas, enquanto define() permite que você defina constantes que não diferenciam maiúsculas de minúsculas passando true como o terceiro argumento:

    define('FOO', 'BAR', true);
    echo FOO; // BAR
    echo foo; // BAR

Então, esse foi o lado ruim das coisas. Agora vamos ver a razão pela qual eu pessoalmente sempre uso const menos que uma das situações acima ocorra:

  • const simplesmente lê melhor. É uma construção de linguagem em vez de uma função e também é consistente com a forma como você define constantes em classes.
  • const , sendo uma construção de linguagem, pode ser estaticamente analisada por ferramentas automatizadas.
  • const define uma constante no namespace atual, enquanto define() deve ser passado no nome completo do namespace:

    namespace A\B\C;
    // To define the constant A\B\C\FOO:
    const FOO = 'BAR';
    define('A\B\C\FOO', 'BAR');
  • Já as constantes const PHP 5.6 também podem ser arrays, enquanto define() não suporta arrays ainda. No entanto, as matrizes serão suportadas para ambos os casos no PHP 7.

    const FOO = [1, 2, 3];    // valid in PHP 5.6
    define('FOO', [1, 2, 3]); // invalid in PHP 5.6, valid in PHP 7.0

Finalmente, note que const também pode ser usado dentro de uma classe ou interface para definir uma constante de classe ou constante de interface. define não pode ser usado para este propósito:

class Foo {
    const BAR = 2; // valid
}
// but
class Baz {
    define('QUX', 2); // invalid
}

Resumo

A menos que você precise de qualquer tipo de definição condicional ou expressional, use const s ao invés de define() s - simplesmente por uma questão de legibilidade!


Até o PHP 5.3, const não pôde ser usado no escopo global. Você só pode usar isso de dentro de uma classe. Isso deve ser usado quando você quiser definir algum tipo de opção constante ou configuração que pertença a essa classe. Ou talvez você queira criar algum tipo de enum.

define pode ser usado para o mesmo propósito, mas só pode ser usado no escopo global. Deve ser usado somente para configurações globais que afetam todo o aplicativo.

Um exemplo de bom uso de const é livrar-se de números mágicos. Dê uma olhada nas constantes do PDO . Quando você precisa especificar um tipo de busca, digite PDO::FETCH_ASSOC , por exemplo. Se consts não fossem usados, você acabaria digitando algo como 35 (ou qualquer FETCH_ASSOC é definido como). Isso não faz sentido para o leitor.

Um exemplo de bom uso de define é talvez especificar o caminho da raiz do seu aplicativo ou o número da versão de uma biblioteca.



Ninguém diz nada sobre php-doc, mas para mim isso também é um argumento muito significativo para a preferência de const :

/**
 * My foo-bar const
 * @var string
 */
const FOO = 'BAR';

Para adicionar a resposta da NikiC. const pode ser usado dentro das classes da seguinte maneira:

class Foo {
    const BAR = 1;

    public function myMethod() {
        return self::BAR;
    }
}

Você não pode fazer isso com define() .


define eu uso para constantes globais.

const eu uso para constantes de classe.

Você não pode define em escopo de classe e com const você pode. Escusado será dizer que você não pode usar const escopo de classe externa

Além disso, com const , ele realmente se torna um membro da classe, com define , ele será enviado para o escopo global.





constants