Różnica między „włączeniem” a „wymaganiem” w php


174

Czy jest między nimi jakaś różnica? Czy ich używanie jest kwestią preferencji? Czy używanie jednego nad drugim daje jakieś korzyści? Co jest lepsze z punktu widzenia bezpieczeństwa?



3
Zawsze używaj „wymagają”. „Włączanie” jest tak wygodne, jak elektryczne drzwi w saunie.
Marco Mariani,

2
@MarcoMariani Jakie byłoby to niewygodne? Prawdopodobnie jest jasne, po prostu tego nie widzę. Może para?
Austin Burk

Mówiąc prościej, jeśli przez pomyłkę brakuje pliku „foo.php”, chcę wiedzieć jak najszybciej, a nie kiedy wywoływana jest funkcja, która powinna znajdować się w foo.php. Zastąpienie dołączenia wymaganiem może często ujawnić błędy. Powiedzmy, że brakuje pliku config.php, a aplikacja działa z domyślną konfiguracją. Co jest lepsze z punktu widzenia bezpieczeństwa? Jeśli chodzi o saunę, to kiedy jestem w środku i drzwi z jakiegoś powodu się nie otwierają, to mi się nie podoba.
Marco Mariani

Odpowiedzi:


148

Różnice wyjaśniono w szczegółowym podręczniku PHP na stronierequire :

requirejest identyczny z includewyjątkiem sytuacji, gdy wystąpi błąd, spowoduje również krytyczny E_COMPILE_ERRORbłąd poziomu. Innymi słowy, zatrzyma skrypt, podczas gdy include emituje tylko ostrzeżenie ( E_WARNING), które pozwala skryptu kontynuować.

Zobacz @ odpowiedź efritz jest na przykład


6
tiposaurus.co.uk/2011/04/04/… "Główna różnica między require () i include () polega na tym, że jeśli potrzebujesz () pliku, którego nie można załadować (np. jeśli go nie ma), to generuje błąd krytyczny, który całkowicie zatrzyma wykonanie strony i nie będzie już generowane żadne dane wyjściowe. Z drugiej strony, jeśli dołączysz () plik, którego nie można załadować, wygeneruje to jedynie ostrzeżenie i kontynuuj tworzenie strony ”.
stormwild

3
„To, którego należy użyć, zależy od sytuacji; require () najlepiej nadaje się do ładowania plików, które są niezbędne dla pozostałej części strony - na przykład, jeśli masz witrynę opartą na bazie danych, użyj require () do dołączenia pliku zawierającego login i hasło bazy danych są zdecydowanie preferowane w stosunku do funkcji include (). Jeśli użyłeś funkcji include () w tej sytuacji, możesz wygenerować więcej ostrzeżeń i błędów, niż zamierzałeś. "
stormwild

3
<?php if (isset($flibbertygibbet)) require 'file.php';wydaje się, że ta odpowiedź wygląda na całkowicie niepoprawną. W przeciwnym razie powinienem otrzymać błąd krytyczny, nawet jeśli warunek nie jest prawdziwy. stracenie pokazuje PHP nawet próbującego dotknąć file.php.
cHao

W przeciwieństwie do funkcji include (), require () zawsze czyta plik docelowy, nawet jeśli linia, w której się znajduje, nigdy nie zostanie wykonana. Jeśli chcesz warunkowo dołączyć plik, użyj funkcji include (). AND Jednakże, jeśli wiersz, w którym występuje require (), nie zostanie wykonany, żaden kod z pliku docelowego nie zostanie wykonany. Wydaje się, że mówię coś przeciwnego, czy też nie rozumiem?
lorless

1
Wszystkie te komentarze odnoszą się do oryginalnej wersji tej odpowiedzi przed jej zredagowaniem. Pierwotnie istniało nieprawidłowe żądanie, twierdzące, if (false) require 'file.php';że spowoduje załadowanie (ale nie wykonanie) pliku „file.php”. TLDR ignoruje wszystkie te komentarze.
Kevin Wheeler


5

Użyj, includejeśli nie masz nic przeciwko kontynuowaniu skryptu bez ładowania pliku (jeśli nie istnieje itp.) I możesz (chociaż nie powinieneś) żyć z wyświetlanym komunikatem o błędzie ostrzegawczym.

Użycie requireoznacza, że ​​skrypt zatrzyma się, jeśli nie może załadować określonego pliku, i zgłosi błąd krytyczny.


2

Jak wskazywali inni, jedyną różnicą jest to, że wymaga rzucania krytycznego błędu, a dołącza - dające się złapać ostrzeżenie. Jeśli chodzi o to, którego użyć, radzę trzymać się tego. Czemu? ponieważ możesz złapać ostrzeżenie i przekazać znaczącą opinię użytkownikom końcowym. Rozważać

  // 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!";
  }

Uwaga: na przykład 2, aby działać, musisz zainstalować program obsługi błędów do wyjątków, jak opisano tutaj 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");   

Na poziomie włączenia nie jest to świetne miejsce, aby dowiedzieć się, że nie ma tam pliku, którego oczekujesz. Żaden problem w twoim przykładzie nie jest problemem, który można zepchnąć na użytkowników Twojej witryny.
Kzqai

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

Bardzo prosty Praktyczny przykład z kodem. Zostanie wyświetlone pierwsze echo. Bez względu na to, czy używasz include lub require, ponieważ jest uruchamiany przed dołączeniem lub wymaganiem.

Aby sprawdzić wynik, w drugiej linii kodu celowo podaj złą ścieżkę do pliku lub popełnij błąd w nazwie pliku. Zatem drugie echo, które ma zostać wyświetlone, będzie całkowicie zależne od tego, czy używasz wymagania, czy dołączenia .

Jeśli używasz wymagania, drugie echo nie zostanie wykonane, ale jeśli użyjesz dołączania, niezależnie od rodzaju błędu, zobaczysz również wynik drugiego echa.


-2

W przypadku dołączenia program nie zakończy działania i nie wyświetli ostrzeżenia w przeglądarce, z drugiej strony, program Require zakończy działanie i wyświetli błąd krytyczny w przypadku nieznalezienia pliku.


Czy naprawdę musiałeś zadać pytanie sprzed 2 i pół roku, aby powtórzyć 2/3 odpowiedzi już mówiących ...?
cHao

4
Aww, to nowicjusz! Prawdopodobnie jeszcze nie rozumie pojęcia SO.
Dan Hanly,

biedny użytkownik2069222, teraz wyszedł SO: '(
Gagantous
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.