Menu

PHP include e require: carregar outros arquivos PHP

include '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.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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 GETe_GET e _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.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR