Feature Flags em PHP: como deixar de ter medo e começar a ativar funcionalidades

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Feature Flags em PHP: a mágica de ativar e desativar funções sem deploy

\n\n

Imagine: você escreveu uma nova funcionalidade — um sistema de recomendações superpoderoso. Tudo testado na máquina local, mas assim que o código vai para produção, o inferno começa. Usuários furiosos, conversão caindo, e você desesperadamente revertendo commits. Familiar?

\n\n

Agora imagine outro cenário. Você implanta a mesma funcionalidade, mas ela está desativada por padrão. Você a ativa para 5% dos usuários, observa as métricas, e a expande gradualmente. Se algo der errado — basta desativar com um clique. Sem deploy. Sem estresse. Essa é a mágica dos Feature Flags (também conhecidos como feature toggles, flags de funcionalidades).

\n\n

Neste artigo do PythonLib, vamos explorar como implementar feature flags em PHP do zero. Você aprenderá não apenas a teoria, mas também obterá trechos de código prontos que pode usar agora mesmo.

\n\n

O que são Feature Flags e por que um desenvolvedor PHP precisa deles?

\n\n

Feature Flag (flag de funcionalidade) é um interruptor de software que permite ativar ou desativar funcionalidades de uma aplicação sem alterar o código ou fazer novo deploy. Simplificando: você escreve o código uma vez e decide se deve mostrá-lo ao usuário ou não, em tempo real.

\n\n

Top 3 razões para usar flags de funcionalidades em PHP:

\n
    \n
  • Deploy seguro: você pode implantar código a qualquer hora do dia. Se algo quebrar — basta desativar a flag.
  • \n
  • Testes A/B: mostre diferentes versões da interface para diferentes segmentos de usuários e compare as métricas.
  • \n
  • Canary releases (lançamentos canários): implante uma nova funcionalidade primeiro para 1% do público, depois para 10%, depois para 100%.
  • \n
\n\n
«Feature Flags são como um interruptor de luz. Você pode ligá-lo para toda a sala, ou apenas para um canto. E não precisa religar a fiação toda vez.»
\n\n

Implementação mais simples de Feature Flags em PHP

\n\n

Vamos começar com a opção mais básica, mas funcional. Suponha que temos um arquivo config.php onde todas as flags são armazenadas:

\n\n
<?php\n// config.php\nreturn [\n    'features' => [\n        'new_checkout' => false,\n        'dark_mode'    => true,\n        'search_v2'    => false,\n    ],\n];\n
\n\n

Agora uma classe wrapper simples para verificar as flags:

\n\n
<?php\nclass FeatureFlagManager\n{\n    private array $features;\n\n    public function __construct(array $config)\n    {\n        $this->features = $config['features'] ?? [];\n    }\n\n    public function isEnabled(string $flag): bool\n    {\n        return $this->features[$flag] ?? false;\n    }\n}\n\n// Uso:\n$manager = new FeatureFlagManager(require 'config.php');\n\nif ($manager->isEnabled('dark_mode')) {\n    echo '<link rel="stylesheet" href="dark.css">';\n}\n
\n\n

A desvantagem dessa abordagem é óbvia: para alternar uma flag, é necessário alterar a configuração e fazer novo deploy. Isso não é melhor do que commitar código. Precisamos de gerenciamento dinâmico.

\n\n

Feature Flags dinâmicos com armazenamento em BD

\n\n

O padrão mais comum é armazenar os estados das flags em um banco de dados ou Redis. Assim, você pode alterá-los através de um painel administrativo sem reiniciar a aplicação.

\n\n

Estrutura da tabela MySQL

\n\n
CREATE TABLE feature_flags (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    flag_name VARCHAR(100) UNIQUE NOT NULL,\n    is_enabled TINYINT(1) DEFAULT 0,\n    description TEXT,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\n);\n
\n\n

Classe para trabalhar com o BD

\n\n
<?php\nclass DbFeatureFlags\n{\n    private PDO $pdo;\n    private array $cache = [];\n\n    public function __construct(PDO $pdo)\n    {\n        $this->pdo = $pdo;\n    }\n\n    public function isEnabled(string $fla                

Blogs

Book Recommendations