PHP para Iniciantes: Constantes - O básico

Apesar de não ser especificamente um tópico na documentação oficial, é fato que constantes tem pontos básicos que precisamos mencionar antes de suas especificações. Então resolvi dedicar esse artigo apenas como uma introdução para quem nunca ouviu falar sobre constantes em desenvolvimento de software. Se você já ouviu falar, é bem provável que saiba tudo o que será dito. Nesse caso, que tal revisar?

Definição de constante

que não muda; inalterável, invariável, fixo.

A palavra-chave para o que é uma constante está presente em qualquer dicionário, como destaquei acima. Não é à toa que usamos essa nomenclatura para definir isso. A intenção é, realmente, dar ao desenvolvedor a opção de colocar dados fixos na aplicação para evitar a constante réplica de informação.

Vou citar um exemplo... Se você já explorou algumas aplicações PHP, você provavelmente já viu como a galera implementa conexões MySQL no PHP de rua.

<?php

$host = 'localhost';
$user = 'root';
$pass = '';
$db= 'my_schema';

return new mysqli($host, $user, $pass, $db);

E isso funciona! E muitas vezes separam esse código em um arquivo central database.php que ficam incluindo onde for precisar dessa conexão. Parte disso é a mesma essência do que falei... Porém, isso contribui para que todos os parâmetros do projeto fiquem espalhados em vários arquivos.

Se você resolve fazer uma conexão com outro banco, faz outro arquivo. Redis? Outro arquivo. Mensageria? Outro arquivo. Cada um com sua configuração. Na hora de migrar a aplicação para outro(s) servidor(es), você será forçado a ficar abrindo cada arquivo para colocar as novas credenciais.

Apesar do certo ser trabalhar com variáveis de ambiente (o famoso .env), você poderia ter centralizado todos esses parâmetros criando um arquivo de configuração (o famoso config.php) com todas as constantes necessárias para o seu aplicativo funcionar. Note que eu falei constante, porque no momento que você tira a declaração de variável do escopo de onde estava, ele pode passar a ser uma variável global e sofrer alterações ao longo do fluxo do código.

Por exemplo, $host pode ser tudo, menos o host do banco de dados. Afinal, se isso é uma variável, ela pode variar. Entende a importância de uma constante num sistema?

Além disso, ao criar constantes para centralizar essas informações, você pode facilmente consultar todo o código para ver onde essas constantes estão sendo utilizadas. Outra vantagem seria, ao invés de ficar trabalhando com include, desbloquear o recurso de autoload de classes do PHP (spl_autoload para importar automaticamente os arquivos de classes baseado em seu namespace).

QUE

Ok, calma, não tem necessidade de falarmos de autoload agora, então vou demonstrar algumas mudanças com include mesmo:

<?php // config.php

define('MYSQLI_HOST', 'localhost');
define('MYSQLI_USERNAME', 'root');
define('MYSQLI_PASSWORD', '');
define('MYSQLI_DATABASE', 'my_schema');
<?php // database.php, usando include pq spl_autoload não é coisa de iniciante #fikdik

include_once('config.php'); // include_once pq constantes só podem ser definidas uma vez

return new mysqli(MYSQLI_HOST, MYSQLI_USERNAME, MYSQLI_PASSWORD, MYSQLI_DATABASE);

Obs.: esse é um exemplo da aplicação da constante. Não é recomendado lidar com conexões ao banco diretamente com sua implementação nativa. Recomendo leitura sobre arquitetura hexagonal, onde cada aplicação externa deve ser representada por um adaptador (uma lib que facilite a conexão, deixando suas trativas técnicas do banco de dados apartada das tratativas do produto). Considere essa como uma dica de boas práticas! Ainda assim, é muito avançado para quem tá começando. Só anota pra ver isso lá pra frente, ok?!

Para definir uma constante, usamos a função define... Então tem alguma que desfaz uma constante, Kiko?

Não! A ideia da criação de constantes é que você nunca vai poder mexer nela. Mas quando eu falo isso, eu falo, obviamente, do interpretador quando está executando sua aplicação. Se a ideia é só retirar do projeto, você só precisa tomar cuidado com uma observação:

<?php

define('UMA_CONSTANTE', 123);
var_dump(UMA_CONSTANTE); // int(123)

Quando a constante é definida, o PHP consegue recuperar seu valor e usar em qualquer lugar. Mas, quando ela não existe, há diferentes comportamentos ao longo das versões do PHP:

  • 8.x pra cima: erro fatal, acessando constante que não existe;
  • 7.2+: warning, processando normalmente;
  • 7.1 pra baixo: notice, processando normalmente.
<?php
var_dump(OUTRA_CONSTANTE);
// se PHP 8 pra cima: fatal error, para tudo
// se PHP 7.2 pra cima: warning, mas continua
// se PHP 7.1 pra baixo: notice, mas continua 
// se continuou, imprime: string(OUTRA_CONSTANTE)

Constantes em classes

No geral, todas as constantes possuem escopo global no código. Tudo o que você definir usando a função define vai ser visível em qualquer lugar, não tem como manter essa constante escondida. Porém, depois da versão 7.1, o PHP passou a aceitar constantes em classes, o que nos traz a opção de modificar a visibilidade de suas constantes entre as opções public (todos), protected (somente a classe e seus filhos) e private (somente a classe). Essas visibilidades vêm do conceito de hierarquia de Programação Orientada a Objeto, vale a pena dar uma lida se não conhece. Falaremos mais sobre isso nos artigos sobre classes, mas apenas para exemplificar:

<?php

class Exemplo {
    public const ATIVO = 'active';
    public const INATIVO = 'inactive';
}

var_dump(Exemplo::ATIVO, Exemplo::INATIVO); // string(active), string(inactive)

O uso de constantes em classe também tem muito sentido, mas vale ressaltar que são apenas centralizações de dados literais não-parametrizáveis, isto é, informações que NÃO CONFIGURAM O COMPORTAMENTO DO PROJETO. O exemplo que citei acima é mais ou menos um dos usos mais comuns, relacionados à criação de Enums para definir os possíveis valores de um campo limitado, para garantir que os desenvolvedores do projeto não vão colocar 'active' em uma parte e 'ativo' em outra, criando erros de digitação.

Deu pra entender a importância?! Espero que sim! E nos próximos artigos vou me aprofundar sobre constantes, mostrando as sintaxes aceitas, constantes pré-definidas e constantes mágicas do PHP. É um conteúdo bacana e acredito que consegui te mostrar a essência por trás desse recurso.

Curtiu? Comenta e compartilha! Vocês que estão lendo sem falar nada me trazem um profundo sentimento de solidão (kkkrying). Ok, parei com o drama. Mas vamos estudar, hein? Qualquer dúvida, é só chamar que respondo.

Inté!