W PHP:
- Kiedy należy używać
require
Vs.include
? - Kiedy należy używać
require_once
Vs.include_once
?
W PHP:
require
Vs. include
?require_once
Vs. include_once
?Odpowiedzi:
Są require
i include_once
również.
Więc twoje pytanie powinno być ...
require
Vs. include
?require_once
vs.require
Odpowiedź na 1 została opisana tutaj .
Funkcja requ () jest identyczna z funkcją include (), z tym wyjątkiem, że inaczej obsługuje błędy. Jeśli wystąpi błąd, funkcja include () generuje ostrzeżenie, ale skrypt będzie kontynuował wykonywanie. Wymagana () generuje błąd krytyczny, a skrypt zostanie zatrzymany.
Odpowiedź na 2 można znaleźć tutaj .
Instrukcja Requ_once () jest identyczna z instrukcją wymaganą (), z tym wyjątkiem, że PHP sprawdzi, czy plik został już dołączony, a jeśli tak, to nie uwzględni (ponownie) go.
require_once()
będzie to szybsze z nich
Posługiwać się
wymagają,
gdy plik jest wymagany przez twoją aplikację, np. ważny szablon wiadomości lub plik zawierający zmienne konfiguracyjne, bez których aplikacja by się zepsuła.
wymagany_zadany,
gdy plik zawiera treść, która spowodowałaby błąd przy kolejnym dołączeniu, np.
function important() { /* important code */}
jest zdecydowanie potrzebny w Twojej aplikacji, ale ponieważ nie można ponownie zadeklarować funkcji, nie należy go ponownie włączać.
dołącz,
gdy plik nie jest wymagany, a przepływ aplikacji powinien być kontynuowany, gdy nie zostanie znaleziony, np.
doskonały do szablonów odwołujących się do zmiennych z bieżącego zakresu lub czegoś
include_once
opcjonalne zależności, które spowodowałyby błędy przy kolejnym ładowaniu lub może zdalne dołączenie pliku, którego nie chciałbyś powtórzyć dwa razy z powodu narzutu HTTP
Ale w zasadzie od Ciebie zależy, kiedy go użyć.
include
? include_once
? require
? require_once
?
Moja sugestia to wykorzystanie require_once
99,9% czasu.
Użycie require
lub include
zamiast tego oznacza, że kodu nie można użyć w innym miejscu, tzn. Że pobierane skrypty faktycznie wykonują kod zamiast udostępniać klasę lub niektóre biblioteki funkcji.
Jeśli potrzebujesz / włączasz kod, który jest wykonywany na miejscu, jest to kod proceduralny i musisz poznać nowy paradygmat . Podobnie jak programowanie obiektowe, programowanie funkcyjne lub programowanie funkcjonalne.
Jeśli już zajmujesz się programowaniem OO lub programowaniem funkcjonalnym, używanie include_once
będzie głównie opóźniało to, gdzie na stosie znajdziesz błędy / błędy. Czy chcesz wiedzieć, że funkcja do_cool_stuff()
nie jest dostępna, kiedy zadzwonisz po nią później lub w momencie, gdy spodziewasz się, że będzie ona dostępna , wymagając biblioteki? Zasadniczo najlepiej jest natychmiast wiedzieć, czy coś, czego potrzebujesz i czego oczekujesz, nie jest dostępne, więc po prostu użyj require_once
.
Alternatywnie, we współczesnym OOP, po prostu automatycznie załaduj swoje klasy po użyciu.
include
rodzina jest zwykle złym pomysłem (ponieważ bardzo rzadko dołącza się pliki, które mają jakiekolwiek możliwości nieistnienia), i poza tym, require_once
i require
powinieneś używać, require_once
gdy dołączasz pliki, które definiują funkcje lub klasy, które mają być używane w innym miejscu lub tworzenie pojedynczych elementów, takich jak obiekty połączenia z bazą danych, i używanie require
do dołączania plików, które natychmiast robią rzeczy, gdy zostaną uwzględnione. W każdej dużej aplikacji internetowej ten drugi rodzaj dołączania jest niezwykły.
require_once
najprawdopodobniej kandydat będzie używany prawie przez cały czas. Biorąc pod uwagę niewielkie różnice ogólne między opcjami, require
zapewnia zatrzymanie skryptu, nie mogę myśleć o wielu scenariuszach, w których aplikacja może przetrwać bez dołączenia pliku. I _once
chroni przed problemami z duplikatem. Każdy, kto się nie zgadza, prawdopodobnie wie, co robi, może wybrać dowolną, która odpowiada aplikacji lub scenariuszowi.
Różnica między funkcjami _once i bez funkcji _once: bez kodu _once zostanie ponownie dołączony, natomiast w przypadku funkcji _once PHP śledzi dołączone pliki i uwzględni je tylko raz.
Różnica między wymaganiem a włączeniem: jeśli nie zostanie znaleziony wymagany plik, PHP wygeneruje błąd krytyczny, podczas gdy w przypadku dołączenia zostanie wyświetlone tylko ostrzeżenie.
include()
wyśle ostrzeżenie, jeśli nie może dołączyć pliku, ale reszta skryptu zostanie uruchomiona.
require()
wyrzuci E_COMPILE_ERROR
i zatrzyma skrypt, jeśli nie może dołączyć pliku.
Funkcje include_once()
i require_once()
nie dołączą pliku po raz drugi, jeśli został już dołączony.
Zobacz następujące strony dokumentacji:
Ilekroć używasz, require_once()
możesz użyć w pliku, aby dołączyć inny plik, gdy potrzebujesz wywoływanego pliku tylko jeden raz w bieżącym pliku. Tutaj w przykładzie mam test1.php.
<?php
echo "today is:".date("Y-m-d");
?>
oraz w innym pliku o nazwie test2.php
<?php
require_once('test1.php');
require_once('test1.php');
?>
gdy oglądasz m wymagający pliku test1 dwa razy, ale plik będzie zawierał test1 raz i dla wywołania za drugim razem zostanie to zignorowane. I bez zatrzymania wyświetli wynik jednorazowo.
Ilekroć używasz 'include_once ()', można użyć w pliku, aby dołączyć inny plik, gdy potrzebujesz więcej niż jeden raz wywoływany plik w bieżącym pliku. Tutaj w przykładzie mam plik o nazwie test3.php.
<?php
echo "today is:".date("Y-m-d");
?>
I w innym pliku, który nazwałem test4.php
<?php
include_once('test3.php');
include_once('test3.php');
?>
podczas oglądania m, w tym plik test3, załączy plik jeden raz, ale zatrzyma dalsze wykonywanie.
Definicje klas i funkcji powinny być uporządkowane w plikach.
Służy require_once()
do ładowania zależności (klas, funkcji, stałych).
Służy require()
do ładowania plików podobnych do szablonów .
Służy include_once()
do ładowania opcjonalnych zależności (klas, funkcji, stałych).
Służy include()
do ładowania opcjonalnych plików podobnych do szablonów .
To pytanie zostało zadane siedem lat temu i żadna z odpowiedzi nie stanowi praktycznej pomocy dla pytania. We współczesnym programowaniu PHP używasz required_once
tylko raz, aby dołączyć klasę autoloadera (często autoloader kompozytora), i załaduje wszystkie twoje klasy i funkcje (pliki funkcji muszą zostać jawnie dodane do composer.json
pliku, aby były dostępne we wszystkich innych plikach). Jeśli z jakiegokolwiek powodu twojej klasy nie można załadować z autoloadera, którego używasz require_once
do załadowania.
Jest kilka okazji, z których musimy skorzystać require
. Na przykład, jeśli masz naprawdę dużą definicję tablicową i nie chcesz dodawać jej do kodu źródłowego definicji klasy, możesz:
<?php
// arr.php
return ['x'=>'y'];
<?php
//main.php
$arr= require 'arry.php'
Jeśli plik, który zamierzasz dołączyć, zawiera coś wykonywalnego lub deklaruje niektóre zmienne, prawie zawsze musisz go użyć require
, ponieważ jeśli użyjesz require_once
oprócz pierwszego miejsca, twój kod nie zostanie wykonany i / lub twoje zmienne nie będą cicho inicjowane, powodując błędy, które są absolutnie trudne do ustalenia.
Nie ma praktyczny przypadek użycia dla include
i include_once
naprawdę.
include()
owiniętego bufora wyjściowego, aby zaimplementować silnik szablonów.
require()
do dzielenia dużych plików.
require_once
z PHPMailer wewnątrz funkcji, a mój autoloader definiuje $mail
zmienną potrzebną później w kodzie, więc następny require_once
zostaje zignorowany, który $mail
nie został zainicjowany! rozwiązaniem było po prostu użyć require
po wywołaniu funkcji.
require
w takich przypadkach?
Różnica polega na błędzie generowanym przez polecenia. Dzięki require
plikowi, którego chcesz użyć, jest naprawdę wymagany i dlatego generuje, E_ERROR
jeśli nie został znaleziony.
require()
jest identyczny zinclude()
wyjątkiem awarii, spowoduje równieżE_ERROR
błąd krytyczny poziomu.
include
generuje E_WARNING
błąd tylko w przypadku niepowodzenia, który jest mniej lub bardziej cichy.
Użyj go, jeśli plik jest wymagany, aby pozostały kod działał i chcesz, aby skrypt nie zadziałał. Plik nie jest dostępny.
Dla *_once()
:
include_once()
może być używany w przypadkach, w których ten sam plik może zostać dołączony i oceniony więcej niż jeden raz podczas konkretnego wykonania skryptu, więc w tym przypadku może pomóc uniknąć problemów, takich jak redefinicje funkcji, zmiany przypisania wartości zmiennych itp.
To samo dotyczy require_once()
oczywiście.
Numer referencyjny: require()
,include_once()
require
daje E_COMPILE_ERROR, a nie E_ERROR.
Wymagaj części krytycznych, takich jak autoryzacja i dołącz wszystkie pozostałe.
Wiele załączników to po prostu bardzo zły projekt i należy go w ogóle unikać. Tak więc * _once nie ma znaczenia.
Dołącz / Wymagaj , możesz dołączyć ten sam plik więcej niż jeden raz:
Wymagana () jest identyczna z włączoną (), ale w przypadku awarii spowoduje także wystąpienie krytycznego błędu poziomu E_COMPILE_ERROR. Innymi słowy, zatrzyma skrypt, podczas gdy include () emituje tylko ostrzeżenie (E_WARNING), które pozwala skryptowi kontynuować.
jest identyczny z włączeniem / wymaganiem, z tym wyjątkiem, że PHP sprawdzi, czy plik został już dołączony, a jeśli tak, to nie dołącz (wymagaj) go ponownie.
include()
wygeneruje ostrzeżenie, gdy nie znajdzie pliku, ale require_once()
wygeneruje błąd krytyczny.
Inną kwestią jest to, czy plik jest dołączany wcześniej. Wówczas require_once()
nie będzie go uwzględniać.
Korzystałem z funkcji, jak poniżej:
function doSomething() {
require_once(xyz.php);
....
}
W xyz.php zadeklarowano stałe wartości.
Muszę wywołać tę funkcję doSomething () z innego pliku skryptu PHP.
Ale obserwowałem zachowanie podczas wywoływania tej funkcji w pętli, dla pierwszej iteracji doSomething () uzyskiwał stałe wartości xyz.php
, ale później każda iteracja doSomething()
nie była w stanie uzyskać zadeklarowanych wartości stałych xyz.php
.
Rozwiązałem problem, przechodząc z require_once()
na include()
, zaktualizowany doSomething()
kod wygląda następująco:
function doSomething() {
include(xyz.php);
....
}
Teraz każde wywołanie iteracji doSomething()
otrzymuje stałe wartości zdefiniowane wxyz.php
.
Z instrukcji :
require()
jest identyczny zinclude()
wyjątkiem awarii, spowoduje równieżE_COMPILE_ERROR
błąd krytyczny poziomu. Innymi słowy, zatrzyma skrypt, podczas gdyinclude()
emituje tylko ostrzeżenie (E_WARNING
), które pozwala na kontynuowanie skryptu.
To samo dotyczy _once()
wariantów.
W dobie PSR-0 / PSR-4
autoloaderów może być zupełnie niepotrzebne korzystanie z którejkolwiek z instrukcji, jeśli wszystko, czego potrzebujesz, to udostępnić kodowi niektóre funkcje / klasy (oczywiście nadal musisz się require_once
autoloader w pliku bootstrap i include
szablonach, jeśli nadal używam PHP jako silnika szablonów).
Kiedy należy użyć require
lub include
?
Funkcje require
i include
wykonują to samo zadanie, tj. Obejmuje i ocenia określony plik, ale różnica polega na require
tym, że błąd krytyczny spowoduje błąd krytyczny, gdy określona lokalizacja pliku będzie nieprawidłowa lub wystąpi dowolny błąd,include
wygeneruje ostrzeżenie i kontynuuje wykonywanie kodu.
Możesz więc użyć tej require
funkcji w przypadku, gdy plik, który próbujesz dołączyć, jest sercem systemu i może mieć ogromny wpływ na resztę kodu i możesz użyćinclude
funkcji, gdy plik, który próbujesz dołączyć, jest prosty plik zawierający nieco mniej ważny kod.
A moim osobistym zaleceniem (w przypadku mniej ważnego kodu) jest wybranie require
funkcji w dowolnym miejscu w kodzie, gdy jest on w fazie programowania, tak aby można było debugować kod, a następnie zastąpić wszystkie require
funkcje include
funkcją przed przeniesieniem go do wersji produkcyjnej, aby w razie pominięcia wszelkie błędy nie wpłyną na użytkownika końcowego, a reszta kodu zostanie wykonana poprawnie ...
Kiedy należy użyć require_once
lubrequire
?
Podstawową różnicą między require
i require_once
jest require_once
sprawdzenie, czy plik jest już dołączony, czy nie, jeśli jest już dołączony, to nie uwzględni pliku, podczas gdyrequire
funkcja obejmie plik niezależnie od tego, czy plik jest już dołączony, czy nie.
Tak więc w przypadkach, w których chcesz raz po raz włączyć jakiś fragment kodu, użyj require
funkcji, a jeśli chcesz dołączyć jakiś kod tylko raz w kodzie, użyj require_once
.
Użyj funkcji wymaganej, gdy musisz załadować dowolną klasę, funkcję lub zależność.
Użyj funkcji dołączania, gdy chcesz załadować plik w stylu szablonu
Jeśli nadal jesteś zdezorientowany, po prostu używaj wymaganego przez cały czas.
Są to wszystkie sposoby dołączania plików.
Wymagaj oznacza, że tego potrzebuje. Require_once oznacza, że będzie go potrzebował, ale wymaga go tylko raz. Uwzględnij oznacza, że będzie zawierać plik, ale nie musi go kontynuować.
Przykłady:
Require 'filename'
Require_once 'filename'
Include 'filename'
Istnieje również funkcja include_once, która zawiera plik raz.
Include_once 'filename'
Nie używaj wielkich liter tam, gdzie mam, pisząc z telefonu.
jedną rzeczą, którą zauważyłem, gdy korzystam z opcji Dołącz, mogę uzyskać dostęp tylko do funkcji dołączonych plików z pliku, który ją zawiera. Dzięki wymaganiu mogę uruchomić tę funkcję w drugim pliku wymagane_pomnie.
też: polecam dodanie
if(file_exists($RequiredFile)){
require_once($RequiredFile);
}else{
die('Error: File Does Not Exist');
}
Ponieważ gdy request_once zabija stronę, czasami może wywołać echo katalogu plików Twojej witryny
Oto niestandardowa funkcja, którą stworzyłem, aby wymagała plików:
function addFile($file, $type = 'php', $important=false){
//site-content is a directory where I store all the files that I plan to require_once
//the site-content directory has "deny from all" in its .htaccess file to block direct connections
if($type && file_exists('site-content/'.$file.'.'.$type) && !is_dir('site-content/'.$file.'.'.$type)){
//!is_dir checks that the file is not a folder
require_once('site-content/'.$file.'.'.$type);
return 'site-content/'.$file.'.'.$type;
}else if(!$type && file_exists('site-content/'.$file) && !is_dir('site-content/'.$file)){
//if you set "$type=false" you can add the file type (.php, .ect) to the end of the "$file" (useful for requiring files named after changing vars)
require_once('site-content/'.$file);
return 'site-content/'.$file;
}else if($important){
//if you set $important to true, the function will kill the page (which also prevents accidentally echoing the main directory path of the server)
die('Server Error: Files Missing');
return false;
}else{
//the function returns false if the file does not exist, so you can check if your functions were successfully added
return false;
}
}
przykład użycia:
$success = addFile('functions/common');
if($success){
commonFunction();
}else{
fallbackFunction();
}
Zasadniczo, jeśli potrzebujesz złej ścieżki, PHP zgłasza błąd krytyczny i wywoływana jest funkcja zamykania, ale jeśli podasz niewłaściwą ścieżkę, PHP będzie kontynuować wykonywanie, ale wyświetli ostrzeżenie, że plik nie istnieje.
Z angielskiego słowa wymaganego PHP wynika, że wykonanie strony lub pliku zależy od wymaganego pliku.
Z mojego doświadczenia wynika, że normalnie wymagane są ważne pliki, takie jak pliki konfiguracyjne, klasy baz danych i inne ważne narzędzia.
Często zależy od tego, czy chcesz warunkowo załadować bibliotekę klienta, czy też załadować ją bez względu na to, czy chcesz z niej korzystać.
Oto konkretny przykład; opracowanie tego, co powiedział pcj.
Załóżmy, że masz plik konfiguracyjny przechowujący nazwę użytkownika i hasło do bazy danych (conf.php):
<?php
//my site configuration file
//For Database
$location='localhost';
$dbuser='yourname';
$userpw='yourpassword';
$database='nameofdatabase';
?>
I klasa z funkcją statyczną, która korzysta z bazy danych:
<?php
class UsedInLoop {
public static function databaseQuery(){
require(/path/to/conf.php); //require_once will not work here
$db = new mysqli($location, $dbuser, $userpw, $database);
//yada yada yada
}
}
?>
I ta funkcja statyczna jest używana wewnątrz innej funkcji, która jest wywoływana iteracyjnie w pętli:
<?php
require_once('path/to/arbitraryObject.php'); //either will likely be OK at this level
$obj = new arbitraryObject();
foreach($array as $element){
$obj->myFunction();
}
?>
Możesz wymagać / dołączyć klasę tylko raz. Jeśli potrzebujesz / dołączasz go do każdej iteracji swojej pętli, pojawi się błąd. Należy jednak dołączyć plik conf za każdym razem, gdy wywoływana jest funkcja statyczna.
<?php
class arbitraryObject {
public function myFunction(){
require_once(/path/to/UsedInLoop.php); //This must be require_once. require() will not work
UsedInLoop::databaseQuery();
}
}
?>
Oczywiście przeniesienie go poza funkcję może być rozwiązaniem tego problemu:
<?php
require(/path/to/UsedInLoop.php); //now require() is fine
class arbitraryObject {
public function myFunction(){
UsedInLoop::databaseQuery();
}
}
?>
Chyba że zajmujesz się obciążeniami związanymi z ładowaniem klasy, która może być używana tylko w określonych warunkach i nie chcesz jej ładować, gdy nie jest.
require
ma większy narzut niż include
, ponieważ musi najpierw przeanalizować plik. Wymiana requires
z includes
często jest to technika dobra optymalizacja.
require
nie analizuje pliku bardziej niż include
robi. Każda z _once
wersji tych funkcji ma trochę narzutów, ale jak powiedzieli inni, w większości aplikacji jest prawie nieistotna.
Wystarczy użyć wymaga i obejmuje.
Ponieważ zastanów się, jak pracować z include_once lub replace_once. To szuka danych dziennika, które zapisują dołączone lub wymagane pliki PHP. To jest wolniejsze niż włączanie i wymaganie.
if (!defined(php)) {
include 'php';
define(php, 1);
}
Po prostu używam w ten sposób ...