Tutorial de PHP com exemplos para executar
Um tutorial e referência gratuitos de PHP 8: arrays, foreach, funções de string, datas, formulários, classes e erros. Cada exemplo roda na página, e os que imprimem HTML mostram a página com formulários que você pode enviar.
Inicie uma jornada guiada de PHPPrimeiros passos
- O que é PHP?PHP é uma linguagem de script do lado do servidor: um arquivo PHP roda no servidor web e envia ao navegador o HTML que ele monta. Ele move o WordPress, o Laravel e boa parte da web, e também executa scripts pela linha de comando.
- Instalar PHPInstale o PHP com um comando: winget no Windows, Homebrew no macOS, apt ou dnf no Linux. Depois rode php -v num terminal para confirmar que funciona e ver qual versão você tem.
- Executar PHPExecute um arquivo PHP no terminal com php index.php, ou sirva uma pasta no navegador com o servidor embutido do PHP: php -S localhost:8000. Nenhum dos dois precisa de Apache ou XAMPP.
- echo e printecho imprime uma ou mais strings: echo "Hello, $name"; ou echo $a, $b;. É o jeito comum de enviar texto ou HTML para a página. print faz o mesmo com um valor e retorna 1; <?= $x ?> é a forma curta dentro do HTML.
- Exibição de errosPara mostrar todos os erros do PHP, coloque ini_set('display_errors', '1'); e error_reporting(E_ALL); no topo do script, ou defina display_errors = On e error_reporting = E_ALL no php.ini. Em produção, registre os erros em log em vez de exibi-los.
- PHP ou PythonPHP foi feito para a web: um arquivo roda a cada requisição e imprime uma página, e ele move o WordPress e o Laravel. Python é uma linguagem de uso geral que também faz web (Django, Flask) e domina ciência de dados, automação e machine learning.
- PHP ou JavaScriptO PHP roda no servidor e envia HTML pronto ao navegador. O JavaScript roda no navegador, onde altera a página depois que ela carrega, e no servidor com Node.js. A maioria dos sites usa os dois: PHP para montar páginas e APIs, JavaScript para a interação.
Fundamentos
- VariáveisUma variável PHP começa com $ e é criada quando você atribui um valor: $name = "Ada";. Não existe palavra-chave de declaração nem tipo fixo. Funções não enxergam variáveis de fora, a menos que você as passe, use global ou as capture; static mantém um valor entre chamadas.
- Tipos de dadosO PHP tem dez tipos: quatro escalares (int, float, string, bool), quatro compostos (array, object, callable, iterable) e dois especiais (null, resource). var_dump($x) mostra o tipo e o valor, gettype($x) retorna o nome do tipo.
- StringsJunte strings em PHP com o operador ponto ("Hello, " . $name) ou coloque variáveis direto entre aspas duplas ("Hello, $name"). Aspas simples imprimem o texto como está. Veja concatenação, .=, interpolação de arrays e objetos e como mudar maiúsculas com strtoupper, strtolower, ucfirst e ucwords.
- Heredoc e nowdocUm heredoc em PHP é uma string de várias linhas que começa com <<<EOT e termina com EOT; ele substitui variáveis como uma string entre aspas duplas. Um nowdoc, <<<'EOT', mantém o texto exatamente como está. Veja a sintaxe, as regras de indentação, a interpolação de arrays e objetos e templates HTML.
- OperadoresOs operadores PHP trabalham com valores: +, -, *, /, %, ** para aritmética, =, +=, .=, ??= para atribuição, &&, ||, ! e xor para lógica, . para juntar strings, ==, ===, <=> para comparação e ++, -- para incrementar. Veja cada grupo com exemplos executáveis, mais a armadilha de precedência entre and e &&.
- Operadores de comparaçãoO PHP compara valores com == (igual depois da conversão de tipos), === (mesmo valor e mesmo tipo), != e !==, < > <= >= e o operador spaceship <=>. Veja quando o == converte tipos, o que mudou no PHP 8 e todas as comparações frouxas e estritas numa tabela.
- Operador ternárioO operador ternário do PHP é um if/else de uma linha: $result = $condition ? 'yes' : 'no';. Veja o ternário curto ?: (operador Elvis), como ele difere do ??, por que ternários aninhados precisam de parênteses desde o PHP 8 e quando o match é a opção mais limpa.
- Coalescência nula ??O operador de coalescência nula do PHP retorna o lado esquerdo, a menos que ele seja null ou não esteja definido: $name = $_GET['name'] ?? 'Guest';. Ele nunca avisa sobre uma variável ou chave de array ausente. Veja cadeias de ??, a atribuição ??=, ?? ou ?: e o operador nullsafe ?->.
- Conversão de tiposConverta uma string PHP em inteiro com (int) $str ou intval($str); (int) "42" é 42 e (int) "12abc" é 12. Veja casts para int, float, bool, string e array, strings numéricas, intval com base, settype e como validar a entrada em vez de receber 0 em silêncio.
- ConstantesUma constante PHP é um nome para um valor que não pode mudar: const MAX_USERS = 100; ou define('MAX_USERS', 100);. Veja define ou const, arrays constantes, constantes de classe com self::, verificação com defined() e as constantes mágicas __LINE__, __FILE__, __DIR__ e __CLASS__.
- isset()isset($var) retorna true quando uma variável existe e não é null, e false caso contrário, sem nenhum aviso. Também verifica chaves de array e propriedades de objetos: isset($user['email']). Veja isset com várias variáveis, chaves aninhadas, isset ou empty, isset ou array_key_exists e como verificar envios de formulário.
- empty()empty($var) retorna true quando uma variável não existe ou é falsa: null, false, 0, 0.0, "", "0" ou []. Ele nunca avisa sobre variáveis ou chaves indefinidas. Veja por que "0" conta como vazio, como verificar uma string ou um array vazio com exatidão, empty ou isset e a validação de formulários.
- Matemática e arredondamentoround($x, 2) arredonda para duas casas decimais, floor() sempre arredonda para baixo e ceil() sempre arredonda para cima. Mais intdiv(), o operador %, ** para potências, abs(), max(), min() e random_int() para números aleatórios.
Controle de fluxo
- if, elseif, elseif (condition) { ... } executa um bloco só quando a condição é verdadeira, elseif verifica a próxima condição, e else roda quando nenhuma bateu. Veja elseif ou else if, && e ||, valores verdadeiros e a sintaxe if: endif; para templates HTML.
- Instrução switchswitch ($value) compara um valor com uma lista de rótulos case e executa o código a partir do primeiro que bate até um break. Veja vários cases, fallthrough, default, switch(true) e por que o switch usa a comparação frouxa ==.
- Expressão matchmatch ($x) { 1, 2 => 'low', default => 'other' } compara um valor com o estrito ===, retorna o resultado do primeiro braço que bate e lança um UnhandledMatchError quando nada bate. Veja match ou switch, match(true) e match com enums.
- Laço forfor ($i = 0; $i < 10; $i++) { ... } executa um bloco um número definido de vezes: valor inicial, condição verificada antes de cada volta e um passo. Veja como percorrer um array pelo índice, contar de trás para frente, loops aninhados, break e continue.
- Laço whilewhile (condition) { ... } repete um bloco enquanto a condição for verdadeira, verificando-a antes de cada volta. do { ... } while (condition); verifica depois, então sempre roda pelo menos uma vez. Veja while (true) com break, como ler um arquivo linha por linha e como evitar loops infinitos.
- Laço foreachforeach ($array as $value) visita cada elemento de um array, e foreach ($array as $key => $value) também dá a chave. Veja como obter o índice, alterar valores por referência e a pegadinha do unset(), break e continue, arrays aninhados, list() no foreach e como montar HTML.
Arrays
- ArraysUm array PHP é uma lista ordenada de valores, cada um guardado sob uma chave: $fruits = ['apple', 'banana']; é lido como $fruits[0]. Veja como criar arrays, ler e alterar elementos, percorrê-los, imprimi-los e qual função de array usar.
- Arrays associativosUm array associativo PHP guarda valores sob chaves com nome: $user = ['name' => 'Ada', 'age' => 36]; é lido como $user['name']. Veja como adicionar, alterar e remover pares, percorrer chaves e valores, pegar todas as chaves ou valores, verificar uma chave e ordenar por chave ou por valor.
- Arrays multidimensionaisUm array multidimensional em PHP é um array cujos elementos são arrays, lido com um par de colchetes por nível: $grid[1][2] ou $users[0]['name']. Veja como criar arrays aninhados, ler e alterar valores profundos, percorrer com foreach aninhado, montar uma tabela HTML, extrair uma coluna e ordenar linhas.
- array_push()array_push($arr, $value) adiciona um ou mais valores ao fim de um array; $arr[] = $value faz o mesmo para um valor e é mais rápido. Veja como adicionar no fim, no início ou no meio de um array, adicionar uma chave e um valor e evitar o bug clássico do valor de retorno.
- count()count($arr) retorna o número de elementos de um array PHP, então count(['a', 'b', 'c']) é 3. Veja como contar arrays aninhados com COUNT_RECURSIVE, a relação entre sizeof() e count(), como contar valores que atendem a uma condição e por que count(null) lança um TypeError desde o PHP 8.
- in_array()in_array($needle, $haystack) retorna true quando o valor está no array. Passe true como terceiro argumento para uma verificação estrita, in_array('1', $ids, true), para que os tipos também precisem bater. Veja o parâmetro strict, buscas sem diferenciar maiúsculas, verificação de vários valores, arrays aninhados e a alternativa rápida com isset.
- array_search()array_search($value, $array) retorna a chave do primeiro elemento igual a $value, ou false quando não há nenhum. Como a chave pode ser 0, sempre teste o resultado com !== false. Veja buscas estritas, como encontrar todas as correspondências, buscar num array multidimensional com array_column e buscas sem diferenciar maiúsculas.
- array_key_exists()array_key_exists('key', $array) retorna true quando o array tem essa chave, mesmo que o valor seja null. isset($array['key']) é mais rápido, mas retorna false para um valor null. Veja a diferença, key_exists(), chaves aninhadas, verificação de várias chaves e por que objetos precisam de property_exists().
- array_merge()array_merge($a, $b) junta arrays num só: valores com chaves numéricas são acrescentados e renumerados, e nas chaves string o array posterior vence. Veja como o array_merge difere do operador + e da sintaxe spread [...$a, ...$b], como juntar uma lista de arrays e quando array_merge_recursive ou array_replace se encaixam melhor.
- array_map()array_map($callback, $array) chama o callback em cada elemento e retorna um novo array com os resultados. Veja arrow functions, chaves, mapear vários arrays de uma vez e quando array_walk ou foreach se encaixam melhor.
- array_filter()array_filter($array, $callback) mantém os elementos para os quais o callback retorna true. Veja como remover valores vazios, filtrar por chave com ARRAY_FILTER_USE_KEY, reindexar o resultado com array_values e somar valores com array_reduce.
- Ordenar arrayssort($array) ordena uma lista no lugar, asort e ksort ordenam um array associativo por valor ou por chave, e usort ordena com a sua própria comparação. Veja todas elas, ordene um array multidimensional por uma coluna e evite o erro clássico $sorted = sort($arr).
- Remover do arrayunset($array[$key]) remove um elemento pela chave, array_splice remove pela posição e renumera, e array_diff remove pelo valor. Veja cada um, como reindexar depois e a armadilha do array_search que apaga o elemento errado.
- array_slice()array_slice($array, $offset, $length) retorna uma cópia de parte de um array sem alterar o original. Veja offsets negativos para os últimos itens, preserve_keys, paginação de uma lista e a diferença para o array_splice.
- array_unique()array_unique($array) remove valores duplicados e mantém a primeira ocorrência de cada um, com a chave original. Veja como reindexar o resultado, remover duplicados ignorando maiúsculas, deixar um array multidimensional único e contar ou encontrar os duplicados.
- array_column()array_column($rows, 'email') retorna o campo email de cada linha como um array simples. Veja o argumento de chave de índice, reindexar linhas pelo id, usar com objetos e encontrar uma linha com array_search.
- Desestruturação e list()[$a, $b] = $array atribui os dois primeiros elementos a $a e $b numa linha, e ['name' => $name] = $user faz o mesmo pela chave. list() é a grafia antiga. Veja como pular elementos, trocar variáveis, retornar vários valores, desestruturar no foreach e o operador spread ....
Strings
- explode()explode(',', $string) divide uma string em cada vírgula e retorna as partes como um array. Veja o parâmetro limit, como dividir por quebra de linha, aplicar trim nas partes e quando str_split ou preg_split são a ferramenta melhor.
- implode()implode(', ', $array) junta os valores de um array numa string com um separador entre eles. Veja implode com chaves, arrays associativos, como montar listas HTML e a diferença entre implode e join.
- str_replace()str_replace($search, $replace, $subject) substitui cada ocorrência de $search por $replace. Veja arrays de valores de busca e substituição, contagem de substituições, str_ireplace sem diferenciar maiúsculas e como substituir só a primeira ocorrência.
- substr()substr($string, $offset, $length) retorna parte de uma string. Veja offsets negativos, como pegar os primeiros ou os últimos caracteres, mb_substr para texto japonês e outros textos UTF-8, substr_count e como cortar texto com reticências.
- strpos()strpos($haystack, $needle) retorna a posição da primeira ocorrência de $needle, ou false se ela não for encontrada. Veja a verificação !== false, o stripos sem diferenciar maiúsculas, a última ocorrência com strrpos e como encontrar todas as ocorrências.
- str_contains()str_contains($haystack, $needle) retorna true se $needle aparece em qualquer lugar de $haystack. Veja a versão sem diferenciar maiúsculas, str_starts_with e str_ends_with, a verificação de várias palavras e a versão com strpos para o PHP 7.
- trim()trim($string) remove espaços, tabulações e quebras de linha das duas pontas de uma string; ltrim() e rtrim() limpam um lado. Veja como remover caracteres específicos, o espaço japonês de largura total e aplicar trim em cada valor de um array.
- strlen()strlen($string) retorna o tamanho de uma string em bytes; mb_strlen($string) retorna em caracteres. Veja por que texto japonês e emoji dão respostas diferentes, como verificar uma string vazia e como validar o tamanho de uma entrada.
- sprintf()sprintf() monta uma string a partir de um formato e de valores: sprintf('%05.2f', 3.14159) retorna "03.14". Veja %s, %d e %f, preenchimento com zeros, casas decimais fixas, alinhamento, numeração de argumentos, printf e vsprintf.
- number_format()number_format(1234567.891, 2) retorna "1,234,567.89": ele arredonda para as casas decimais pedidas e adiciona um separador de milhar. Veja os quatro parâmetros, os formatos europeu e japonês, como ele arredonda e por que o resultado é uma string.
- Quebras de linhaPara imprimir uma nova linha no PHP, escreva "\n" dentro de aspas duplas ou use PHP_EOL. Numa página web a quebra de linha não aparece, então use <br> ou nl2br(). Veja a diferença, por que '\n' entre aspas simples não funciona e como dividir ou remover quebras de linha.
- preg_match()preg_match($pattern, $subject, $matches) testa uma string contra uma expressão regular e retorna 1 quando bate, 0 quando não bate. Veja grupos de captura, grupos nomeados, preg_match_all, âncoras, padrões de validação e o modificador u para UTF-8 e texto japonês.
- preg_replace()preg_replace($pattern, $replacement, $subject) substitui cada correspondência de uma expressão regular: preg_replace('/\s+/', ' ', $text) junta os espaços em branco. Veja retrorreferências como $1, preg_replace_callback, como remover caracteres não alfanuméricos, limites e contagens.
Funções
- FunçõesDefina uma função PHP com function name($param) { return $value; }. Veja valores de retorno, parâmetros padrão, argumentos nomeados, passagem por referência, declarações de tipo com strict_types, tipos nullable e union e variádicos ...$args.
- Arrow functionsUma arrow function é uma função anônima de uma expressão escrita fn($x) => $x * 2. Ela usa variáveis de fora automaticamente, por valor, sem use. Veja a sintaxe, como a captura funciona, tipos, callbacks para array_map e usort e quando usar uma closure completa.
- Funções anônimasUma função anônima (closure) é uma função sem nome guardada numa variável: $greet = function ($name) { return "Hi $name"; };. Veja a palavra-chave use, captura por referência, callables, a sintaxe de callable de primeira classe strlen(...) e closures dentro de classes.
- GeneratorsUm generator é uma função que usa yield para devolver valores um de cada vez, para que o foreach percorra um milhão de itens sem montar um array. Veja yield, chaves, economia de memória, sequências infinitas, yield from, send() e getReturn().
Classes e objetos
- Classes e objetosUma classe PHP é um molde declarado com `class Name { }`, e `new Name()` cria um objeto a partir dela. Veja propriedades, métodos, `$this`, public/private/protected, propriedades tipadas e readonly, `__toString` e por que atribuir um objeto não o copia.
- ConstrutoresUm construtor PHP é o método `__construct()`, que roda automaticamente quando você escreve `new ClassName(...)`. Veja a promoção de propriedades no construtor, argumentos padrão e nomeados, validação, `parent::__construct()` e como simular vários construtores com métodos de fábrica estáticos.
- HerançaNo PHP, uma classe herda de outra com `class Dog extends Animal`: ela recebe as propriedades e os métodos public e protected da classe pai, pode sobrescrevê-los e ainda pode chamar o original com `parent::method()`. Veja sobrescrita, protected, final, instanceof e a armadilha dos métodos privados.
- InterfacesUma interface PHP lista os métodos que uma classe promete ter: `interface Shape { public function area(): float; }`, e `class Circle implements Shape` precisa então definir `area()`. Veja type hints com interfaces, implementar várias interfaces, constantes de interface, interfaces que estendem outras, interfaces nativas como Countable e interface ou classe abstrata.
- Classes abstratasUma classe abstrata PHP é declarada `abstract class Name` e não pode ser instanciada: ela existe para ser estendida. Pode ter propriedades, um construtor e métodos prontos, mais métodos `abstract` sem corpo que toda classe filha precisa implementar.
- TraitsUma trait PHP é um bloco reutilizável de métodos e propriedades que você copia para uma classe com `use TraitName;`. Veja como usar várias traits, resolver conflitos de nome com `insteadof` e `as`, membros abstratos e estáticos em traits, qual método vence e trait, interface ou classe abstrata.
- EnumsUm enum PHP (8.1+) é um tipo com uma lista fixa de valores: `enum Status: string { case Active = 'active'; }`. Veja enums puros e backed, `->value` e `->name`, conversão com `from()` e `tryFrom()`, como listar os casos com `cases()`, métodos, constantes, interfaces e enums no `match`.
- Métodos estáticosUm método ou propriedade `static` pertence à classe, não a um objeto: você o chama com `ClassName::method()` e lê com `ClassName::$count`, sem precisar de `new`. Veja `self::` e `static::` (late static binding), `new static`, variáveis estáticas dentro de funções e quando static é a ferramenta errada.
- NamespacesUm namespace PHP agrupa classes, funções e constantes sob um prefixo: `namespace App\Models;` no topo de um arquivo e depois `use App\Models\User;` em outro lugar para se referir à classe pelo nome curto. Veja nomes totalmente qualificados, aliases com `use ... as`, `use function`, a barra invertida inicial para classes globais e o autoload PSR-4.
Erros e exceções
- try catchNo PHP, código que pode falhar vai num bloco `try { }`, e `catch (Exception $e) { }` roda se ele lançar uma exceção, com o motivo em `$e->getMessage()`. Veja como capturar vários tipos de exceção, `finally`, por que `catch (Exception)` não pega `TypeError` nem `DivisionByZeroError` (capture `Throwable`), relançar e um handler global.
- ExceçõesVocê lança uma exceção no PHP com `throw new Exception('message');`, e quem chama a lê com `$e->getMessage()` num bloco `catch`. Veja as classes de exceção nativas, como escrever exceções próprias, `getCode()`, `getLine()` e `getPrevious()`, `throw` como expressão e os erros que o próprio PHP lança, como `ValueError` e `TypeError`.
Dados, arquivos e a web
- json_encode()json_encode($value) transforma um array, objeto ou escalar PHP numa string JSON. Arrays associativos viram objetos JSON, listas viram arrays JSON, e flags como JSON_PRETTY_PRINT e JSON_UNESCAPED_UNICODE controlam a saída.
- json_decode()json_decode($json, true) transforma uma string JSON num array associativo PHP; sem true você recebe objetos stdClass. Veja valores aninhados, tratamento de erros com JSON_THROW_ON_ERROR, json_validate() e por que o json_decode retorna null.
- date()date('Y-m-d') retorna a data de hoje como string, e date('Y-m-d', $timestamp) formata qualquer timestamp Unix. Veja time(), mktime(), strtotime(), DateTimeImmutable, somar dias, a diferença entre duas datas e fusos horários, com exemplos que você pode executar.
- Formato de dataUm formato de data no PHP é uma string de letras como 'Y-m-d H:i:s', em que Y é o ano com 4 dígitos, m o mês, d o dia, H a hora, i os minutos e s os segundos. Aqui está cada caractere de formato com um exemplo, mais escape, ISO 8601, datas em japonês e conversão de um formato para outro.
- file_get_contents()file_get_contents('notes.txt') lê um arquivo inteiro e o retorna como uma string, ou false se não conseguir. A parceira file_put_contents() escreve uma string num arquivo, e file() retorna as linhas como array.
- fopen()fopen('data.txt', 'r') abre um arquivo e retorna um handle, ou false em caso de falha. Leia do handle com fgets() ou fread(), escreva com fwrite() e feche com fclose(). O modo ('r', 'w', 'a', 'x', 'c' e as formas com +) decide o que você pode fazer.
- include e requireinclude 'header.php'; executa outro arquivo PHP naquele ponto, como se o código dele estivesse colado ali. O require faz o mesmo, mas interrompe o script com um erro fatal quando o arquivo não existe, enquanto o include só avisa e continua. include_once e require_once carregam um arquivo só na primeira vez.
- FormuláriosUm formulário PHP envia para si mesmo com <form method="post">, e o script lê os campos de $_POST['name'] quando $_SERVER['REQUEST_METHOD'] é 'POST'. Veja validação, mensagens de erro ao lado dos campos, manter os valores digitados, checkboxes e selects, e como escapar a saída.
- $_GET e $_POST$_GET guarda a query string da URL (?page=2 dá $_GET['page']) e $_POST guarda os campos de um formulário enviado com method="post". Veja como ler os dois com segurança, montar links com http_build_query, verificar $_SERVER['REQUEST_METHOD'] e escolher entre GET e POST.
- htmlspecialchars()htmlspecialchars($text) transforma os cinco caracteres que têm significado no HTML (& < > " ') em entidades, para que a entrada do usuário apareça como texto em vez de rodar como marcação. Veja ENT_QUOTES, como escapar atributos, codificação dupla, htmlentities e strip_tags.
- Sessões e cookiesChame session_start() no topo de cada página e guarde valores em $_SESSION['key']; o PHP os mantém no servidor e reconhece o visitante por um cookie. setcookie('name', 'value', $options) guarda um valor pequeno no navegador, lido de volta em $_COOKIE. Veja login, logout, mensagens flash, opções de cookie e as configurações de segurança.
- password_hash()Gere o hash de uma senha com password_hash($password, PASSWORD_DEFAULT), guarde o resultado de 60 caracteres e verifique um login com password_verify($password, $hash). Veja por que o hash muda a cada vez, o custo, password_needs_rehash, Argon2id e por que md5 e sha1 são errados para senhas.
- filter_var()filter_var($value, FILTER_VALIDATE_EMAIL) retorna o valor se ele for válido e false se não for; FILTER_VALIDATE_INT, FILTER_VALIDATE_URL, FILTER_VALIDATE_BOOL e FILTER_VALIDATE_IP funcionam do mesmo jeito. Veja as opções (min_range, default), as flags, os filtros de sanitização e a armadilha do false e do 0.
- PDOPDO é a camada de banco de dados do PHP: conecte com new PDO('mysql:host=localhost;dbname=shop;charset=utf8mb4', $user, $pass) e depois execute toda consulta com valores por prepare() e execute([$value]). Veja conexão, prepared statements, leitura de linhas, inserts, transações e WHERE IN.
- ComposerComposer é o gerenciador de pacotes do PHP: composer require vendor/package baixa uma biblioteca para vendor/, registra-a no composer.json, e require 'vendor/autoload.php' a carrega. Veja como instalar o Composer, o composer.json, restrições de versão, install ou update e o autoload PSR-4 para as suas próprias classes.
Depuração e prática
- var_dump() e print_r()print_r($array) imprime um array de forma legível, var_dump($value) também mostra cada tipo e tamanho, e var_export imprime código PHP válido. Veja quando usar cada um, como obter o print_r como string e como formatar a saída no HTML com <pre>.
- Perguntas de entrevista24 perguntas de entrevista PHP com respostas curtas e corretas para o PHP 8, de == e === e isset e empty até referências no foreach, self e static, generators, SQL injection e hash de senhas. A maioria das respostas tem código que você pode executar e alterar.