PHP include e require
Um site de verdade tem dezenas de páginas, e todas repetem o mesmo cabeçalho, o mesmo menu e o mesmo rodapé. Copiar e colar esse HTML em cada página seria um pesadelo: para mudar um telefone, você teria que editar todas. Com include e require, você escreve o pedaço repetido uma vez, num arquivo separado, e manda o PHP "colar" esse arquivo onde precisar.
- O que
includeerequirefazem (e que eles "colam" o arquivo no lugar). - A diferença entre os dois quando o arquivo não existe: um aviso (
Warning) × um erro fatal. - Para que servem
include_onceerequire_once. - Como montar um site com cabeçalho e rodapé reaproveitados.
- Por que caminhos como
../cabecalho.phpquebram, e como__DIR__resolve. - Como um arquivo de configuração pode devolver um array com
return.
Os exemplos acontecem na máquina fictícia da Ana (ana@notebook), que está montando o site da sua lojinha de bolos. Antes desta aula, vale ter visto Funções e PHP Dentro do HTML.
A ideia: um carimbo
Pense num carimbo com o endereço da loja. A Ana não escreve o endereço à mão em cada envelope: ela carimba. Se a loja mudar de endereço, ela troca o carimbo, e todos os envelopes novos saem certos.
No PHP, o "carimbo" é um arquivo (cabecalho.php, por exemplo) e o ato de carimbar é a linha include 'cabecalho.php';. Quando o PHP encontra essa linha, ele:
- procura o arquivo
cabecalho.php; - lê o arquivo e executa o que estiver dentro, como se o código estivesse escrito ali, no lugar da linha do
include; - continua o arquivo original da linha seguinte em diante.
Os nomes vêm do inglês: include = "incluir"; require = "exigir". A diferença entre "incluir" e "exigir" é justamente o que acontece quando o arquivo não está lá, como você vai ver.
O primeiro include
A Ana criou três arquivos na pasta inc. Primeiro, o cabeçalho:
<?php echo "=== Lojinha da Ana ===\n";
Depois, o rodapé:
<?php echo "--- (c) 2026 Lojinha da Ana ---\n";
E a página principal, que usa os dois:
<?php include 'cabecalho.php'; echo "Bem-vindo! Hoje temos bolos e doces.\n"; include 'rodape.php';
- include
- A instrução "inclua aqui o arquivo…". Não é uma função: é uma palavra da própria linguagem, por isso não precisa de parênteses (escrever
include('cabecalho.php');também funciona, mas os parênteses são enfeite). - 'cabecalho.php'
- O nome do arquivo, entre aspas, como qualquer texto. Pode ser um caminho (
'partes/cabecalho.php') ou uma variável. - ;
- Como toda instrução do PHP, termina com ponto e vírgula.
$ cd inc $ php index.php === Lojinha da Ana === « veio do cabecalho.php Bem-vindo! Hoje temos bolos e doces. « do próprio index.php --- (c) 2026 Lojinha da Ana --- « veio do rodape.php
O resultado é exatamente o mesmo que você teria se as três linhas echo estivessem no index.php. A vantagem: o cabeçalho e o rodapé agora podem ser usados por qualquer outra página.
<?php
Todo arquivo incluído é lido do zero, em "modo HTML". Se você esquecer o <?php no começo dele, o PHP mostra o código como texto em vez de executá-lo. É por isso que um arquivo só com HTML (sem nenhum PHP) também pode ser incluído: ele simplesmente sai como está.
As variáveis são compartilhadas
Como o código incluído "entra no lugar" do include, ele enxerga as variáveis que já existiam ali, e as variáveis que ele cria continuam existindo depois:
<?php $titulo = "Promoções"; include 'mostra-titulo.php'; echo "De volta: $saudacao\n";
<?php echo "Título recebido: $titulo\n"; $saudacao = "olá do arquivo incluído";
$ php variaveis.php Título recebido: Promoções « o incluído leu $titulo De volta: olá do arquivo incluído « e criou $saudacao para o principal
Isso é muito usado para passar o título da página para o cabeçalho. Mas atenção: se o include estiver dentro de uma função, as variáveis do arquivo ficam presas dentro da função (é o escopo local):
<?php
function carrega(): void
{
include 'config-var.php'; // config-var.php só tem: $loja = 'Lojinha da Ana';
echo "Dentro da função: $loja\n";
}
carrega();
echo "Fora da função: $loja\n";
$ php dentro-func.php Dentro da função: Lojinha da Ana Warning: Undefined variable $loja in /home/ana/inc/dentro-func.php on line 8 Fora da função:
Experimente: a página abaixo esqueceu de incluir o rodapé. Os três arquivos estão nas abas da caixa.
Missão: no index.php, acrescente uma linha que inclua o rodape.php depois da mensagem de boas-vindas. Clique em Rodar e veja as três partes.
<?php include 'cabecalho.php'; echo "Bem-vindo! Hoje temos bolos e doces.\n";
<?php echo "=== Lojinha da Ana ===\n";
<?php echo "--- Obrigada pela visita! ---\n";
<?php include 'cabecalho.php'; echo "Bem-vindo! Hoje temos bolos e doces.\n"; include 'rodape.php';
include × require: quando o arquivo não existe
Os dois fazem a mesma coisa quando o arquivo existe. A diferença aparece quando ele não existe (nome errado, arquivo apagado, pasta errada). Veja o mesmo programa com cada um. O arquivo menu.php não existe:
<?php include 'menu.php'; echo "A página continuou depois do include.\n";
$ php falta-include.php; echo "código: $?" Warning: include(menu.php): Failed to open stream: No such file or directory in /home/ana/inc/falta-include.php on line 2 Warning: include(): Failed opening 'menu.php' for inclusion (include_path='.:') in /home/ana/inc/falta-include.php on line 2 A página continuou depois do include. « o programa seguiu em frente código: 0
Com include, o PHP dá dois avisos (Warning) e continua. Agora com require:
<?php require 'menu.php'; echo "A página continuou depois do require.\n";
$ php falta-require.php; echo "código: $?"
Warning: require(menu.php): Failed to open stream: No such file or directory in /home/ana/inc/falta-require.php on line 2
Fatal error: Uncaught Error: Failed opening required 'menu.php' (include_path='.:') in /home/ana/inc/falta-require.php:2
Stack trace:
#0 {main}
thrown in /home/ana/inc/falta-require.php on line 2
código: 255 « o echo nunca rodou
Com require, o PHP para tudo com um erro fatal (Fatal error). A linha do echo nunca é executada, e o programa termina com o código 255 (erro).
Lendo as mensagens
| Pedaço da mensagem | O que quer dizer |
|---|---|
Failed to open stream | "Falhou ao abrir o fluxo": o PHP tentou abrir o arquivo e não conseguiu. |
No such file or directory | "Arquivo ou diretório inexistente": o motivo. Outro motivo comum é Permission denied (sem permissão de leitura). |
Failed opening 'menu.php' for inclusion | "Falhou ao abrir para inclusão": o resumo do include. |
Failed opening required 'menu.php' | O mesmo, para o require, que vira um erro (Error) e para o programa. |
include_path='.:' | As pastas onde o PHP procurou, separadas por :. O . é a pasta atual. No PHP instalado pelo apt do Ubuntu/Debian aparece '.:/usr/share/php'. |
Uncaught Error | "Erro não capturado": no PHP 8, o erro do require é uma exceção do tipo Error. |
Qual usar?
Pergunte-se: a página faz sentido sem esse arquivo?
- Arquivo de funções, de configuração, a conexão com o banco, o cabeçalho com o
<html>: sem eles a página quebra de qualquer jeito. Userequire: é melhor parar logo, com uma mensagem clara, do que continuar e gerar dez erros confusos depois. - Um pedaço opcional (um banner de promoção, um aviso que às vezes existe): use
include, e a página segue sem ele.
Na prática, a maior parte do código PHP moderno usa require (ou require_once) quase sempre.
Missão: rode como está e veja os dois Warning do include e a frase final. Depois troque include por require e rode de novo: a frase final some e aparece o Fatal error.
<?php include 'menu.php'; echo "A página continuou.\n";
<?php require 'menu.php'; echo "A página continuou.\n";
include_once e require_once: só uma vez
Às vezes o mesmo arquivo acaba sendo incluído duas vezes: a página inclui funcoes.php, e o cabeçalho, que ela também inclui, inclui funcoes.php de novo. Com um arquivo que só tem echo, o texto apareceria duas vezes. Com um arquivo que define funções, é pior:
<?php
function preco_com_desconto(float $preco): float
{
return $preco * 0.9;
}
<?php include 'funcoes.php'; include 'funcoes.php'; echo preco_com_desconto(20), "\n";
$ php duas-vezes.php; echo "código: $?"
Fatal error: Cannot redeclare function preco_com_desconto() (previously declared in /home/ana/inc/funcoes.php:2) in /home/ana/inc/funcoes.php on line 2
Stack trace:
#0 {main}
código: 255
"Cannot redeclare function" = "não é possível declarar a função de novo": uma função só pode ser criada uma vez. A versão _once ("uma vez") resolve: ela anota quais arquivos já foram incluídos e ignora os pedidos repetidos.
<?php include_once 'funcoes.php'; include_once 'funcoes.php'; // ignorado: já foi incluído echo preco_com_desconto(20), "\n";
$ php duas-once.php 18
| Instrução | Arquivo não existe | Arquivo já incluído antes | Uso típico |
|---|---|---|---|
include | Warning, continua | Inclui de novo | Pedaços de HTML opcionais, que podem repetir |
require | Fatal error, para | Inclui de novo | Cabeçalho e rodapé de página |
include_once | Warning, continua | Ignora | Raro |
require_once | Fatal error, para | Ignora | Arquivos com funções, classes, configuração, conexão com o banco |
Arquivo que define coisas (funções, classes, constantes): require_once. Arquivo que mostra coisas (pedaços de HTML): require (ou include, se for opcional). Mais adiante, no Nível 3, o autoload vai carregar as classes sozinho, e você vai escrever bem menos require_once.
Cabeçalho e rodapé de um site
Agora o uso mais comum de todos. A Ana quer que todas as páginas do site tenham o mesmo topo (com o menu) e o mesmo rodapé. Ela separa o HTML em três arquivos:
<!doctype html> <html lang="pt-BR"> <head><meta charset="utf-8"><title><?= htmlspecialchars($titulo) ?></title></head> <body> <header> <h1>Lojinha da Ana</h1> <nav><a href="?pagina=inicio">Início</a> | <a href="?pagina=contato">Contato</a></nav> </header>
<footer>
<p>© <?= date('Y') ?> Lojinha da Ana — Campinas/SP</p>
</footer>
</body>
</html>
<?php
$pagina = $_GET['pagina'] ?? 'inicio';
$titulo = match ($pagina) {
'contato' => 'Contato',
default => 'Início',
};
require __DIR__ . '/cabecalho.php';
if ($pagina === 'contato') {
echo "<p>Fale com a Ana: (19) 99999-0000</p>\n";
} else {
echo "<p>Bolos e doces feitos em casa.</p>\n";
}
require __DIR__ . '/rodape.php';
| Linha | O que faz |
|---|---|
$pagina = $_GET['pagina'] ?? 'inicio'; | Lê qual página foi pedida no endereço (?pagina=contato); se não veio nada, usa 'inicio'. Veja $_GET e $_POST. |
$titulo = match (…) | Escolhe o título da aba. O cabeçalho vai usar essa variável. |
require __DIR__ . '/cabecalho.php'; | Cola o topo da página. O __DIR__ você vai entender na próxima seção. |
if … else | O conteúdo próprio de cada página. |
require __DIR__ . '/rodape.php'; | Cola o rodapé, que fecha o </body> e o </html>. |
Repare que cabecalho.php e rodape.php são quase só HTML, com pequenos trechos <?= … ?>. E que o cabeçalho usa htmlspecialchars no título, como manda a aula Escapar a Saída. Com o servidor embutido rodando na pasta (php -S localhost:8000, em outro terminal), a Ana pediu a página de contato com o curl:
$ curl -s "localhost:8000/index.php?pagina=contato" <!doctype html> <html lang="pt-BR"> <head><meta charset="utf-8"><title>Contato</title></head> <body> <header> <h1>Lojinha da Ana</h1> <nav><a href="?pagina=inicio">Início</a> | <a href="?pagina=contato">Contato</a></nav> </header> <p>Fale com a Ana: (19) 99999-0000</p> « a única parte que veio do index.php <footer> <p>© 2026 Lojinha da Ana — Campinas/SP</p> </footer> </body> </html>
O navegador recebe uma página única e completa: ele nem fica sabendo que ela foi montada a partir de três arquivos. Isso acontece no servidor, antes de a resposta sair.
Missão: o site abre na página ?pagina=sobre, que ainda não existe (cai no "Início"). No index.php, faça a página sobre mostrar o parágrafo Desde 2020 adoçando Campinas. e ter o título Sobre. Use também a aba Resultado para clicar no menu. Bônus: acrescente o link "Sobre" no menu do cabecalho.php.
<?php
$pagina = $_GET['pagina'] ?? 'inicio';
$titulo = match ($pagina) {
'contato' => 'Contato',
default => 'Início',
};
require __DIR__ . '/cabecalho.php';
if ($pagina === 'contato') {
echo "<p>Fale com a Ana: (19) 99999-0000</p>\n";
} else {
echo "<p>Bolos e doces feitos em casa.</p>\n";
}
require __DIR__ . '/rodape.php';
<!doctype html> <html lang="pt-BR"> <head><meta charset="utf-8"><title><?= htmlspecialchars($titulo) ?></title></head> <body> <header> <h1>Lojinha da Ana</h1> <nav><a href="?pagina=inicio">Início</a> | <a href="?pagina=contato">Contato</a></nav> </header>
<footer>
<p>© <?= date('Y') ?> Lojinha da Ana — Campinas/SP</p>
</footer>
</body>
</html>
<?php
$pagina = $_GET['pagina'] ?? 'inicio';
$titulo = match ($pagina) {
'contato' => 'Contato',
'sobre' => 'Sobre',
default => 'Início',
};
require __DIR__ . '/cabecalho.php';
if ($pagina === 'contato') {
echo "<p>Fale com a Ana: (19) 99999-0000</p>\n";
} elseif ($pagina === 'sobre') {
echo "<p>Desde 2020 adoçando Campinas.</p>\n";
} else {
echo "<p>Bolos e doces feitos em casa.</p>\n";
}
require __DIR__ . '/rodape.php';
<!doctype html> <html lang="pt-BR"> <head><meta charset="utf-8"><title><?= htmlspecialchars($titulo) ?></title></head> <body> <header> <h1>Lojinha da Ana</h1> <nav><a href="?pagina=inicio">Início</a> | <a href="?pagina=sobre">Sobre</a> | <a href="?pagina=contato">Contato</a></nav> </header>
É tentador escrever include $_GET['pagina'] . '.php'; e economizar o match. Não faça isso: quem visita o site controla o endereço, e pode pedir ?pagina=../../algum/arquivo para fazer o seu servidor abrir arquivos que não deveria. O jeito seguro é o da Ana: uma lista fixa de páginas permitidas (match, if ou um array), e o resto cai no padrão.
Caminhos: onde o PHP procura o arquivo
Até aqui todos os arquivos estavam na mesma pasta. Mas sites crescem, e a Ana criou uma subpasta paginas/ dentro de inc/, com o arquivo sobre.php, que precisa do cabeçalho da pasta de cima:
<?php include '../cabecalho.php'; // "suba uma pasta e pegue o cabeçalho" echo "Sobre a loja: desde 2020.\n";
Rodando de dentro de paginas/, funciona. Rodando de outra pasta, não:
$ cd paginas $ php sobre.php === Lojinha da Ana === Sobre a loja: desde 2020. $ cd .. $ php paginas/sobre.php Warning: include(../cabecalho.php): Failed to open stream: No such file or directory in /home/ana/inc/paginas/sobre.php on line 2 Warning: include(): Failed opening '../cabecalho.php' for inclusion (include_path='.:') in /home/ana/inc/paginas/sobre.php on line 2 Sobre a loja: desde 2020.
Por quê? Um caminho que começa com ./ ou ../ é calculado a partir da pasta atual (a pasta onde o programa foi chamado, a do pwd), e não da pasta onde está o arquivo sobre.php. Quando a Ana estava em inc/, o ../ apontou para /home/ana, onde não há cabeçalho nenhum. Num servidor web acontece o mesmo: a "pasta atual" depende de qual script foi chamado, e um arquivo incluído por outro herda essa pasta.
A solução: __DIR__
__DIR__ é uma constante mágica: o PHP troca essa palavra pela pasta onde está o arquivo em que ela foi escrita, sempre como caminho completo. A irmã dela, __FILE__, é o caminho completo do próprio arquivo.
<?php include __DIR__ . '/../cabecalho.php'; echo "Sobre a loja: desde 2020.\n"; echo __DIR__, "\n"; echo __FILE__, "\n";
$ cd ~ $ php inc/paginas/sobre2.php === Lojinha da Ana === « funcionou mesmo chamado de /home/ana Sobre a loja: desde 2020. /home/ana/inc/paginas « __DIR__ /home/ana/inc/paginas/sobre2.php « __FILE__
- __DIR__
- Vira
'/home/ana/inc/paginas', não importa de onde o programa foi chamado. Duas sublinhas antes e duas depois. - .
- O operador de concatenação: junta os dois textos.
- '/../cabecalho.php'
- O resto do caminho. Comece com
/, porque__DIR__não termina com barra. O resultado é/home/ana/inc/paginas/../cabecalho.php, que é o mesmo que/home/ana/inc/cabecalho.php.
include 'cabecalho.php' sem ./?
Um nome "solto" (sem ./, ../ ou /) é procurado primeiro nas pastas do include_path (a pasta atual, ., e outras configuradas) e, se não achar, na pasta do arquivo que fez o include. Por isso os exemplos do começo funcionaram. Mas essa busca depende de configuração e pode achar um arquivo de mesmo nome em outra pasta. O hábito profissional é sempre escrever __DIR__ . '/arquivo.php': não há dúvida de qual arquivo será usado.
include que devolve um valor: arquivos de configuração
Um arquivo incluído pode terminar com return, igual a uma função. O valor devolvido vira o resultado do include/require, e você pode guardá-lo numa variável. Esse é o jeito mais organizado de fazer um arquivo de configuração:
<?php
return [
'loja' => 'Lojinha da Ana',
'cidade' => 'Campinas',
'frete' => 12.5,
];
<?php
$config = require 'config.php';
echo "Loja: {$config['loja']}\n";
echo "Frete: R$ " . number_format($config['frete'], 2, ',', '.') . "\n";
var_dump($config);
$ php usa-config.php
Loja: Lojinha da Ana
Frete: R$ 12,50
array(3) {
["loja"]=>
string(14) "Lojinha da Ana"
["cidade"]=>
string(8) "Campinas"
["frete"]=>
float(12.5)
}
A vantagem sobre criar variáveis soltas no config.php (como $loja = '…';): fica claro, na página, de onde veio cada valor ($config['frete']), nenhuma variável aparece "do nada" e o arquivo funciona igual dentro de funções.
O que o include devolve quando não há return
<?php $a = include 'rodape.php'; var_dump($a); $b = @include 'naoexiste.php'; var_dump($b); $c = include_once 'rodape.php'; var_dump($c);
$ php retorno.php --- (c) 2026 Lojinha da Ana --- int(1) « deu certo e o arquivo não tem return: devolve 1 bool(false) « o arquivo não existe: devolve false (o @ escondeu os Warnings) bool(true) « include_once de um arquivo já incluído: devolve true e não inclui
O @ na frente do include é o operador que silencia os avisos daquela linha. Use com muito cuidado (veja Tipos de Erro): esconder um aviso não conserta o problema.
Missão: no config.php, mude o frete para 15.0. No index.php, mostre também a linha Cidade: Campinas lendo o valor do array $config.
<?php
$config = require __DIR__ . '/config.php';
echo "Loja: {$config['loja']}\n";
echo "Frete: R$ " . number_format($config['frete'], 2, ',', '.') . "\n";
<?php
return [
'loja' => 'Lojinha da Ana',
'cidade' => 'Campinas',
'frete' => 12.5,
];
<?php
$config = require __DIR__ . '/config.php';
echo "Loja: {$config['loja']}\n";
echo "Frete: R$ " . number_format($config['frete'], 2, ',', '.') . "\n";
echo "Cidade: {$config['cidade']}\n";
<?php
return [
'loja' => 'Lojinha da Ana',
'cidade' => 'Campinas',
'frete' => 15.0,
];
Quando dá errado
A Ana trocou o include do paginas/sobre.php por require e rodou de dentro de inc/:
$ php paginas/sobre.php
Warning: require(../cabecalho.php): Failed to open stream: No such file or directory in /home/ana/inc/paginas/sobre.php on line 2
Fatal error: Uncaught Error: Failed opening required '../cabecalho.php' (include_path='.:') in /home/ana/inc/paginas/sobre.php:2
Stack trace:
#0 {main}
thrown in /home/ana/inc/paginas/sobre.php on line 2
O que significa: o arquivo não foi achado a partir da pasta atual. Às vezes funciona num lugar e quebra em outro (no terminal × no servidor).
Como consertar: confira o nome (maiúsculas contam no Linux: Cabecalho.php ≠ cabecalho.php) e troque o caminho relativo por __DIR__ . '/../cabecalho.php'.
Fatal error: Cannot redeclare function preco_com_desconto() (previously declared in /home/ana/inc/funcoes.php:2) in /home/ana/inc/funcoes.php on line 2
O que significa: o arquivo que define a função foi incluído duas vezes (às vezes por caminhos diferentes: um require na página e outro dentro do cabeçalho).
Como consertar: use require_once em arquivos que definem funções e classes.
O que significa: o arquivo incluído não começa com <?php. O PHP leu o conteúdo como HTML comum e mandou para a tela.
Como consertar: coloque <?php na primeira linha do arquivo incluído. Em arquivos só de PHP, não feche com ?> no final (evita espaços em branco "fantasmas" na página; veja Sintaxe).
Warning: Undefined variable $loja in /home/ana/inc/dentro-func.php on line 8
O que significa: o include foi feito dentro de uma função, e as variáveis dele ficaram presas lá; ou o include veio depois da linha que usa a variável.
Como consertar: faça o arquivo devolver um valor com return e guarde-o ($config = require …), ou passe os valores como parâmetros de função.
Referência
| Item | O que é |
|---|---|
include 'a.php'; | Inclui e executa a.php. Se não existir: Warning e continua (devolve false). |
require 'a.php'; | Igual, mas se não existir: Fatal error (exceção Error) e para. |
include_once / require_once | Não inclui de novo um arquivo que já foi incluído (devolve true). |
$x = require 'a.php'; | Guarda o valor do return de a.php (ou 1, se não houver return). |
__DIR__ | Pasta do arquivo atual, caminho completo, sem barra no fim. |
__FILE__ | Caminho completo do arquivo atual. |
get_included_files() | Devolve um array com todos os arquivos já incluídos (útil para depurar). |
include_path | Configuração do php.ini com as pastas onde nomes "soltos" são procurados. |
Exercícios
1. Parar se faltar
O arquivo conexao.php é indispensável e define funções. Complete a linha:
2. Caminho seguro
Complete para incluir rodape.php, que está na mesma pasta do arquivo atual, sem depender da pasta de onde o programa foi chamado:
3. Guardar a configuração
O config.php termina com return ['loja' => 'Lojinha da Ana'];. Complete para guardar o array:
4. O arquivo banner.php não existe. O que acontece com include 'banner.php'; echo "fim";?
5. Para que serve o _once em require_once?
6. Em /home/ana/inc/paginas/sobre.php, o que vale __DIR__?
Resumo
includeerequire"colam" outro arquivo PHP no lugar da linha e o executam, compartilhando as variáveis.- Arquivo inexistente:
includedáWarninge continua;requiredáFatal errore para. Userequirepara o que é indispensável. _onceevita incluir o mesmo arquivo duas vezes (e o erroCannot redeclare function). Userequire_oncepara arquivos de funções e classes.- Cabeçalho e rodapé em arquivos separados: muda num lugar, muda no site inteiro.
- Caminhos com
../dependem da pasta atual; escreva__DIR__ . '/arquivo.php'. - Um arquivo pode terminar com
return [...], e$config = require 'config.php';guarda o valor. - Nunca inclua um nome vindo do usuário: use uma lista de páginas permitidas.
Próxima aula: Ler e Escrever Arquivos, para o PHP guardar e ler os seus próprios dados em arquivos de texto.