Feature Flags em PHP: a mágica de ativar e desativar funções sem deploy
\n\nImagine: 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\nAgora 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\nNeste 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\nO que são Feature Flags e por que um desenvolvedor PHP precisa deles?
\n\nFeature 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\nTop 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
«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\nVamos 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:
<?php\n// config.php\nreturn [\n 'features' => [\n 'new_checkout' => false,\n 'dark_mode' => true,\n 'search_v2' => false,\n ],\n];\n\n\nAgora 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\nA 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\nFeature Flags dinâmicos com armazenamento em BD
\n\nO 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\nEstrutura da tabela MySQL
\n\nCREATE 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\nClasse 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