include 'header.php'; executa o código de outro arquivo PHP naquele ponto do script, como se ele estivesse colado ali. require 'header.php'; faz o mesmo, mas se o arquivo não puder ser carregado, o require interrompe o script com um erro fatal, enquanto o include só imprime um aviso e continua. O primeiro uso comum é um cabeçalho e um rodapé compartilhados por todas as páginas.
O bloco escreve header.php e footer.php primeiro, para que haja arquivos a incluir. Rode e olhe a aba Page:
Os arquivos incluídos são arquivos PHP comuns: podem conter HTML com tags <?= ?> e enxergam a variável $title definida antes do require. Mude o título e rode de novo; toda página que faz require do cabeçalho receberia uma mudança feita naquele único arquivo.
include ou require
A única diferença é o que acontece quando o arquivo não existe ou não pode ser lido. O include imprime dois avisos, vale false e o script continua:
Warning: include(sidebar.php): Failed to open stream: No such file or directory in /home/index.php on line 2
Warning: include(): Failed opening 'sidebar.php' for inclusion (include_path='.:/usr/share/php83') in /home/index.php on line 2
O require imprime o mesmo aviso e depois lança um Error, que encerra o script, a menos que algo o capture:
PHP Warning: require(config.php): Failed to open stream: No such file or directory in /home/index.php on line 2
PHP Fatal error: Uncaught Error: Failed opening required 'config.php' (include_path='.:/usr/share/php83') in /home/index.php:2
Então use require para tudo sem o que a página não roda (configuração, bibliotecas de funções, arquivos de classe) e include para partes opcionais. Para uma parte que pode legitimamente não existir, verifique antes em vez de depender do aviso:
Saída:
Spring sale: 20% off
banner.php included, include returned int(1)
sidebar.php not found, skipped
include_once e require_once
Um arquivo que define uma função ou uma classe só pode ser carregado uma vez: carregá-lo uma segunda vez é um erro fatal, porque a função já existe.
Fatal error: Cannot redeclare greet() (previously declared in /home/helpers.php:2) in /home/helpers.php on line 2
Isso acontece assim que dois arquivos fazem cada um require 'helpers.php'. O require_once e o include_once lembram quais arquivos já foram carregados e os pulam na segunda vez, retornando true:
Saída:
int(1)
bool(true)
bool(true)
Hello, Ada
Use as formas _once para arquivos que declaram coisas, e o include simples para templates que você quer imprimir mais de uma vez. Em projetos que usam Composer, o autoloader carrega os arquivos de classe para você, então as chamadas require_once para classes praticamente desaparecem; veja Composer.
Retornar um valor de um arquivo incluído
Um return no nível superior de um arquivo incluído para aquele arquivo e devolve um valor para a expressão include ou require. Isso dá um arquivo de configuração limpo: nada de variáveis globais, só um valor que você atribui ao nome que quiser.
Saída:
My Shop
shop
bool(false)
Os arquivos de configuração do Laravel (config/app.php, config/database.php e os outros) funcionam assim.
Variáveis e escopo em arquivos incluídos
O código incluído roda no escopo da linha que o inclui. No topo de um script ele enxerga todas as variáveis globais; dentro de uma função, só as variáveis locais dessa função. Essa segunda regra é como funciona um pequeno renderizador de templates: uma função cujas variáveis locais são exatamente as variáveis que o template deve enxergar.
A aba Page mostra as duas listas, renderizadas a partir de um único arquivo de template. Como o include roda dentro de render(), o template enxerga $heading e $products, mas não $secret. A forma foreach ... endforeach usada no template é a sintaxe alternativa que o PHP oferece para templates HTML.
Caminhos de include e DIR
Um caminho como 'helper.php' não é resolvido em relação ao arquivo que contém o include. O PHP procura na configuração include_path (que normalmente começa com ., o diretório de trabalho atual) e só depois na pasta do próprio arquivo que inclui. Então, dentro de partials/nav.php, include 'helper.php' pode carregar um helper.php completamente diferente, da raiz do projeto. O __DIR__, o diretório do arquivo atual, elimina a adivinhação:
Saída:
loaded the root helper.php
loaded partials/helper.php
__DIR__ in nav.php is partials
Escreva todo include como __DIR__ . '/relative/path.php'. O diretório de trabalho depende de como o script foi iniciado (o servidor web, um cron job, a linha de comando a partir de outra pasta), mas o __DIR__ nunca muda.
Nunca inclua um arquivo escolhido pelo usuário
Um primeiro roteador comum lê o nome da página da URL: include $_GET['page'] . '.php';. Isso deixa um visitante escolher qual arquivo do servidor roda, por exemplo ?page=../../config (local file inclusion), e com configurações antigas até um arquivo de outro servidor. Mapeie nomes permitidos para arquivos. Rode o bloco e clique nos links: cada clique executa o script de novo com outro $_GET['page'].
Só os três nomes em $pages podem chegar ao require; o link ../secret recebe a página "Not found". Ler valores da requisição com segurança é explicado em _POST.
Perguntas frequentes
Qual a diferença entre include e require no PHP?
Os dois carregam e executam outro arquivo PHP. Se o arquivo não puder ser carregado, o require interrompe o script com um erro fatal, enquanto o include imprime um aviso, retorna false e deixa o script continuar. Use require para arquivos sem os quais a página não funciona, como configuração e bibliotecas de funções.
Quando devo usar require_once em vez de require?
Use require_once para arquivos que definem funções, classes ou constantes. Carregar um arquivo desses duas vezes é um erro fatal (Cannot redeclare), e o require_once pula o arquivo se ele já foi carregado. Templates que você quer imprimir várias vezes usam o include simples.
Um arquivo PHP incluído pode retornar um valor?
Sim. Um return no nível superior do arquivo incluído o encerra e vira o valor da expressão include ou require: $config = require 'config.php'; com return ['debug' => true]; em config.php. Sem return, o include vale 1.
Um arquivo incluído tem acesso às minhas variáveis?
Sim. O código incluído roda no escopo da linha que o inclui: no topo de um script ele enxerga as variáveis globais, e dentro de uma função enxerga as variáveis locais dessa função e mais nada. As variáveis que ele cria ficam nesse mesmo escopo.
Devo escrever include('file.php') ou include 'file.php'?
Os dois funcionam, porque include e require são construções da linguagem, não funções; os parênteses só envolvem o caminho. A maioria dos guias de estilo escreve require 'file.php'; sem eles.