Diferença entre "incluir" e "exigir" no php


174

Existe alguma diferença entre eles? Usá-los é uma questão de preferência? Usar um sobre o outro produz vantagens? Qual é melhor para segurança?



3
Sempre use "exigir". "incluir" é tão conveniente quanto uma porta elétrica em uma sauna.
Marco Mariani

2
@MarcoMariani Como isso seria inconveniente? Provavelmente está claro, só não estou vendo. Talvez o vapor?
Austin Burk

Simplificando, se um arquivo 'foo.php' estiver faltando por engano, eu quero saber o mais rápido possível, não quando uma função que deveria estar no foo.php for chamada. Substituir include com require geralmente pode revelar erros. Digamos que o config.php esteja ausente e o aplicativo esteja sendo executado com uma configuração padrão. Qual é melhor para segurança? Quanto à sauna, quando estou dentro e a porta não abre por algum motivo, eu não gosto.
Marco Mariani

Respostas:


148

Você encontra as diferenças explicadas no manual detalhado do PHP na página derequire :

requireé idêntico, includeexceto se houver falha, também produzirá um E_COMPILE_ERRORerro de nível fatal . Em outras palavras, ele interromperá o script, enquanto include apenas emite um aviso ( E_WARNING) que permite que o script continue.

Veja a resposta de @ efritz para um exemplo


6
tiposaurus.co.uk/2011/04/04/… "A principal diferença entre require () e include () é que se você precisar () de um arquivo que não possa ser carregado (por exemplo, se não estiver lá), então ele gera um erro fatal que interromperá completamente a execução da página e não será gerada mais saída.Por outro lado, se você incluir () um arquivo que não pode ser carregado, isso simplesmente gerará um aviso e continue construindo a página ".
stormwild

3
"O que você deve usar depende da situação; require () é mais adequado para carregar arquivos essenciais para o restante da página - por exemplo, se você tiver um site orientado a banco de dados, use o require () para incluir um arquivo contendo o o login e a senha do banco de dados são claramente preferidos ao uso de include (). Se você usou o include () nessa situação, poderá gerar mais avisos e erros do que pretendia. "
stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';parece fazer com que esta resposta pareça totalmente incorreta. Caso contrário, eu deveria receber um erro fatal, mesmo que a condição não seja verdadeira. stracenão mostra o PHP nem tentando tocar file.php.
cHao

Ao contrário de include (), require () sempre lerá no arquivo de destino, mesmo se a linha em que ele estiver nunca for executada. Se você deseja incluir um arquivo condicionalmente, use include (). E No entanto, se a linha na qual ocorre o require () não for executada, nenhum código no arquivo de destino será executado. Parece estar dizendo a coisa oposta, ou estou entendendo mal?
Lorless

1
Todos esses comentários se referem à versão original desta resposta antes de ser editada. Originalmente, havia uma reivindicação inválida, alegando que if (false) require 'file.php';faria com que 'file.php' fosse carregado (mas não executado). O TLDR desconsidera todos esses comentários.
Kevin Wheeler


5

Usar include se você não se importa de continuar seu script sem carregar o arquivo (caso ele não exista, etc.) e você pode (embora não deva) viver com uma mensagem de erro de aviso sendo exibida.

Usar requiresignifica que seu script será interrompido se não puder carregar o arquivo especificado e lançará um erro fatal.


2

Como outros apontaram, a única diferença é que isso requer um erro fatal e inclui - um aviso capturável. Quanto a qual usar, meu conselho é manter a inclusão. Por quê? porque você pode receber um aviso e produzir um feedback significativo para os usuários finais. Considerar

  // Example 1.
  // users see a standard php error message or a blank screen
  // depending on your display_errors setting
  require 'not_there'; 


  // Example 2.
  // users see a meaningful error message
  try {
      include 'not_there';
  } catch(Exception $e) {
     echo "something strange happened!";
  }

Nota: por exemplo 2 para funcionar, você precisa instalar um manipulador de erros para exceções, conforme descrito aqui http://www.php.net/manual/en/class.errorexception.php

  function exception_error_handler($errno, $errstr, $errfile, $errline ) {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  set_error_handler("exception_error_handler");   

No nível de inclusão, não é um ótimo lugar para aprender que o arquivo que você espera não está lá. Nenhum dos problemas do seu exemplo é um dos fatores que impedem os visualizadores do site.
Kzqai

0
<?PHP
echo "Firstline";
include('classes/connection.php');
echo "I will run if include but not on Require";
?>

Um exemplo prático muito simples com código. O primeiro eco será exibido. Não importa o que você use incluir ou exigir, porque suas execuções anteriores incluem ou são necessárias.

Para verificar o resultado, na segunda linha de um código, forneça intencionalmente o caminho errado para o arquivo ou cometa um erro no nome do arquivo. Portanto, o segundo eco a ser exibido ou não será totalmente dependente de você usar exigir ou incluir .

Se você usar exigir que o segundo eco não seja executado, mas se você usar incluir, não importa o erro, você verá o resultado do segundo eco também.


-2

No caso de o Programa Incluir não terminar e exibir um aviso no navegador, por outro lado, o Exigir que o programa termine e exibirá um erro fatal no caso de um arquivo não encontrado.


Você realmente teve que fazer uma pergunta de 2 anos e meio para repetir o que 2/3 das respostas já disseram ...?
cHao

4
Aww, ele é um novato! Provavelmente ainda não entende o conceito de SO.
Dan Hanly

user2069222, agora ele saiu do SO: '(
Gagantous 3/02/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.