Principais erros de desenvolvedores PHP iniciantes: de A a Z
\nO PHP continua sendo uma das linguagens mais populares para desenvolvimento web. No entanto, no caminho do iniciante, são frequentes as armadilhas que podem custar horas de depuração. Neste artigo, analisaremos os erros mais comuns de desenvolvedores PHP iniciantes — desde sintáticos até lógicos. Cada erro é acompanhado por um exemplo de código e a solução correta. Vamos lá!
\n\n1. Erros no trabalho com variáveis e tipos de dados
\nPHP é uma linguagem com tipagem dinâmica, o que frequentemente confunde os iniciantes. O erro mais comum é a confusão entre comparação estrita e não estrita.
\n\n1.1. Uso de == em vez de ===
\nO operador == faz conversão de tipos, o que pode dar um resultado inesperado.
// Ruim: comparação não estrita\n$value = 0;\nif ($value == "0abc") {\n echo "Igual!"; // Exibirá "Igual!", porque "0abc" é convertido para 0\n}\n\n// Bom: comparação estrita\nif ($value === "0abc") {\n echo "Igual!"; // Não será executado, tipos diferentes\n}\n\n1.2. Ignorar isset() e empty()
\nTentar acessar uma chave de array inexistente é um clássico.
\n\n// Ruim: causará um Warning\n$data = [];\necho $data['name']; // Notice: Undefined index\n\n// Bom: verificamos a existência\nif (isset($data['name'])) {\n echo $data['name'];\n}\n\n// Ou com verificação de vazio\nif (!empty($data['name'])) {\n echo $data['name'];\n}\n\n2. Problemas de segurança: injeção SQL e XSS
\nSegurança é o calcanhar de Aquiles de muitos iniciantes. Duas principais ameaças: injeção SQL e cross-site scripting (XSS).
\n\n2.1. Entrada não escapada em consultas SQL
\nNunca insira dados do usuário diretamente na consulta!
\n\n// Ruim: vulnerável a injeção\n$username = $_POST['username'];\n$query = "SELECT * FROM users WHERE username = '$username'";\n\n// Bom: usamos prepared statements (PDO)\n$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');\n$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");\n$stmt->execute(['username' => $username]);\n$result = $stmt->fetchAll();\n\n2.2. Exibir dados sem escapamento
\nSe você exibe dados obtidos do usuário, sempre escape o HTML.
\n\n// Ruim: vulnerável a XSS\necho "Olá, " . $_GET['name'];\n\n// Bom: usamos htmlspecialchars()\necho "Olá, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\n\n3. Erros no trabalho com funções e escopos
\nIniciantes frequentemente confundem escopos de variáveis e tratam erros incorretamente em funções.
\n\n3.1. Esquecer o global ou a passagem de parâmetros
\nDentro de uma função, variáveis externas não são visíveis, a menos que sejam declaradas especificamente.
\n\n// Ruim: variável $count não definida dentro da função\n$count = 0;\nfunction increment() {\n $count++; // Warning: Undefined variable\n}\n\n// Bom: passamos um parâmetro\nfunction increment($count) {\n return $count + 1;\n}\n$count = increment($count);\n\n// Ou usamos global (mas é uma má prática)\nfunction incrementGlobal() {\n global $count;\n $count++;\n}\n\n3.2. Ignorar valores de retorno
\nMuitas funções retornam false ou null em caso de erro. Verifique isso!
// Ruim: não verificamos o resultado\n$file = fopen('file.txt', 'r');\nfwrite($file, 'data'); // Se o arquivo não abriu — erro\n\n// Bom: verificamos\nif ($file = fopen('file.txt', 'r')) {\n fwrite($file, 'data');\n fclose($file);\n} else {\n echo "Não foi possível abrir o arquivo";\n}\n\n4. Erros lógicos e arquiteturais típicos
\nEsses erros estão relacionados à compreensão incorreta do funcionamento do PHP ou a um design ruim.
\n\n