W PHP:
- Kiedy należy używać
requireVs.include? - Kiedy należy używać
require_onceVs.include_once?
W PHP:
requireVs. include?require_onceVs. include_once?Odpowiedzi:
Są requirei include_oncerównież.
Więc twoje pytanie powinno być ...
requireVs. include?require_oncevs.requireOdpowiedź 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_once99,9% czasu.
Użycie requirelub includezamiast 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_oncebę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.
includerodzina 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_oncei requirepowinieneś używać, require_oncegdy 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 requiredo 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_oncenajprawdopodobniej kandydat będzie używany prawie przez cały czas. Biorąc pod uwagę niewielkie różnice ogólne między opcjami, requirezapewnia zatrzymanie skryptu, nie mogę myśleć o wielu scenariuszach, w których aplikacja może przetrwać bez dołączenia pliku. I _oncechroni 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_ERRORi 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_oncetylko 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.jsonpliku, 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_oncedo 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_onceopró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 includei include_oncenaprawdę.
include()owiniętego bufora wyjściowego, aby zaimplementować silnik szablonów.
require()do dzielenia dużych plików.
require_oncez PHPMailer wewnątrz funkcji, a mój autoloader definiuje $mailzmienną potrzebną później w kodzie, więc następny require_oncezostaje zignorowany, który $mailnie został zainicjowany! rozwiązaniem było po prostu użyć requirepo wywołaniu funkcji.
requirew takich przypadkach?
Różnica polega na błędzie generowanym przez polecenia. Dzięki requireplikowi, którego chcesz użyć, jest naprawdę wymagany i dlatego generuje, E_ERRORjeśli nie został znaleziony.
require()jest identyczny zinclude()wyjątkiem awarii, spowoduje równieżE_ERRORbłąd krytyczny poziomu.
includegeneruje E_WARNINGbłą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()
requiredaje 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_ERRORbłą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-4autoloaderó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_onceautoloader w pliku bootstrap i includeszablonach, jeśli nadal używam PHP jako silnika szablonów).
Kiedy należy użyć requirelub include?
Funkcje requirei includewykonują to samo zadanie, tj. Obejmuje i ocenia określony plik, ale różnica polega na requiretym, ż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 requirefunkcji 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 requirefunkcji 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 requirefunkcje includefunkcją 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_oncelubrequire?
Podstawową różnicą między requirei require_oncejest require_oncesprawdzenie, 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 requirefunkcji, 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.
requirema większy narzut niż include, ponieważ musi najpierw przeanalizować plik. Wymiana requiresz includesczęsto jest to technika dobra optymalizacja.
requirenie analizuje pliku bardziej niż includerobi. Każda z _oncewersji 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 ...