require, include, require_once와 include_once의 차이점은 무엇입니까?


답변:


1426

있다 requireinclude_once뿐만 아니라.

그래서 당신의 질문은 ...

  1. 언제 requirevs.를 사용해야 include합니까?
  2. 언제 require_oncevs.를 사용해야합니까require

1에 대한 답변이 여기 에 설명되어 있습니다 .

require () 함수는 오류를 다르게 처리한다는 점을 제외하면 include ()와 동일합니다. 오류가 발생하면 include () 함수가 경고를 생성하지만 스크립트는 계속 실행됩니다. require ()는 치명적인 오류를 생성하고 스크립트가 중지됩니다.

2에 대한 답변은 여기 에서 찾을 수 있습니다 .

require_once () 문은 require ()와 동일합니다. 단, PHP는 파일이 이미 포함되어 있는지 확인하고, 포함되어 있으면 다시 포함시키지 않아야합니다.


58
require ()가 require_once ()보다 빠르게 실행된다는 생각이 들기 때문에 중복 된 include가없는 경우 require ()를 사용하십시오.
dialex

48
@DiAlex, require_once는 느리지 만 측정 할 수는 없습니다.
Falken 교수 계약

77
@DiAlex ... 그리고 파일이 실제로 이미 포함되어있는 것으로 밝혀지면 require_once()둘 중 더 빠를 것입니다.
Tom

11
@ Prof.Falken 어떤 상황에서 같은 파일이 두 번 이상 필요합니까? 나는 현재 마음가짐 속에있는 것을 생각할 수 없습니다.
Weishi Zeng

17
웹 페이지의 @WeishiZeng에는 HTML 스 니펫이 두 번 이상 포함되어있을 수 있습니다.
James Beninger

406

사용하다

  • 필요
    파일이 때 필요한 응용 프로그램에서 중요한 메시지 템플릿 또는 응용 프로그램이 중단 것이다없이 파일을 포함하는 구성 변수를 예.


  • 파일에 후속 포함시 오류가 발생하는 내용이 포함 된 경우 require_once ( 예 : function important() { /* important code */}응용 프로그램에 반드시 필요하지만 함수를 다시 선언 할 수 없으므로 다시 포함하지 않아야 함)

  • 파일이 필요하지 않을 때 포함 하고 응용 프로그램 흐름을 찾을 수 없을 때 계속해야합니다. 예를 들어
    현재 범위 또는 변수에서 변수를 참조하는 템플릿에 적합합니다.


  • 후속로드시 오류를 발생 시키거나 HTTP 오버 헤드로 인해 두 번 발생하지 않는 원격 파일 포함을 포함하는 include_once 선택적 종속성

그러나 기본적으로 어느 것을 사용할지는 당신에게 달려 있습니다.


데이터베이스에 PDO 연결 이 있습니다 . 어느 것을 사용해야합니까? include? include_once? require? require_once?
Shafizadeh

6
w3schools를 연결하는 다른 답변 대신 질문에 간단히 대답하고 공식 매뉴얼에 대한 링크이므로 허용되는 답변이어야합니다.
Daniel W.

9
필요하지 않은 이유를 알려주세요.
Francisco Ochoa

1
머리글, 열, 바닥 글 등의 섹션이 포함 된 일반 페이지 레이아웃에 템플릿을 사용하고 있습니다. 이렇게하면 사이트의 모든 페이지에 해당 템플릿을 제공 할 수 있으며 페이지 폴더 구조에 파일을 작성하기 만하면됩니다. 각 위치에 들어가야합니다. 페이지에 사이드 바가 필요하지 않다고 결정하면 해당 파일의 폴더에 해당 파일을 남겨두고 해당 파일이 없으면 템플릿이 여전히 잘 작동합니다.
James Coyle

301

내 제안은 require_once시간의 99.9 %를 사용하는 것입니다.

사용 require또는 include대신에 당신의 코드가 당신이 당기는있는 스크립트가 실제로 재사용 다른 곳, 즉 아니라는 것을 의미한다 실행 하고 대신 코드를 사용할 수 클래스 또는 일부 함수 라이브러리를.

그 자리에서 실행되는 코드가 필요하거나 포함되어 있다면 절차 코드이므로 새로운 패러다임을 알아야합니다 . 객체 지향 프로그래밍, 함수 기반 프로그래밍 또는 기능 프로그래밍과 유사합니다.

이미 OO 또는 함수형 프로그래밍을 수행하는 경우 스택에서 버그 / 오류가 발견되는 위치 include_once를 사용 하면 대부분 지연 됩니다. do_cool_stuff()나중에 호출 할 때 함수 를 사용할 수 없거나 라이브러리를 요구하여 함수 를 사용할 수 있는 순간을 알고 싶습니까? 일반적으로 필요하고 기대하는 것을 사용할 수없는 경우 즉시 아는 것이 가장 좋습니다 require_once.

또는 현대 OOP에서는 사용시 클래스를 자동로드 하십시오.


41
+1 이것은 정답입니다. 요점은 include가족이 일반적으로 나쁜 나쁜 생각이며 (존재하지 않을 가능성이있는 파일을 포함하는 것은 매우 드물기 때문에) require_oncerequire에서 또는 함수 또는 클래스를 정의하는require_once 파일을 포함 할 때 사용해야한다는 것입니다 다른 곳에서 사용하거나 데이터베이스 연결 객체와 같은 싱글 톤을 인스턴스화 하고 포함되면 즉시 작업을 수행 하는 파일을 포함 하는 데 사용 됩니다. 모든 대형 웹 응용 프로그램에서 후자의 종류는 포함되지 않습니다. require
Mark Amery

7
+1 (또 다른 금 배지를 가짐;)) require_once거의 모든 시간에 현명하게 사용될 가능성이 높다는 데 동의 하십시오. 선택 사항 사이에 약간의 오버 헤드 차이가 있으므로 require스크립트 중지를 보장하므로 파일을 포함하지 않고 응용 프로그램이 생존 할 수있는 많은 시나리오를 생각할 수 없습니다. 그리고 _once속임수 문제로부터 보호합니다. 동의하지 않는 사람은 자신이 무엇을하고 있는지 알기 때문에 응용 프로그램이나 시나리오에 적합한 것을 선택할 수 있습니다.
James

이봐 난 때때로 색인 페이지에 포함되어 있고 직접 호출 (man.php)라는 맨 시간에 파일이 있습니다 ........... 이제 난 이미 기능이 필요한 색인 페이지에 구성 파일을 포함 시켰습니다. require_once를 사용할 수 있습니다 포함을 방지하기 위해 home.php에
Ravinder Payal

@RavinderPayal 글쎄, 첫 번째 조언은 프론트 컨트롤러를 사용하여 두통을 피하는 것입니다! 사용자가 example.com/home을 호출한다고해서 완전히 별개의 home.php가 있어야한다는 의미는 아닙니다! 대신 / home /은 index.php 또는 front.php의 프론트 컨트롤러를 통해 라우팅해야합니다. 단지 PHP만이 올드 스쿨 "페이지 당 하나의 스크립트"접근을 더 이상 허용하고 나를 믿습니다. 그러나 반드시 home.php와 index.php를 별도로 가져야하는 경우 라이브러리 파일 또는 템플릿 인 ../templates/home.tpl 또는 ../view/home.view.php에 있어야합니다. 당신은 알고 있습니까?
Kzqai

SNS와 나는 쉬운 개발을 위해 처음에는 한 페이지의 파일 접근 방식을 선택하고 다시 만들 수없는 큰 파일 스택을 선택하여 문제를 해결했으며 한 파일을 한 페이지로 만드는 다른 이유는 속도가 높고 하드 디스크와의 접촉이 적습니다. 포함 수 감소
Ravinder Payal

36

_once 함수와 _once 함수의 차이점 : _once 코드가 없으면 다시 포함되는 반면 _once 함수를 사용하면 PHP가 포함 된 파일을 추적하여 한 번만 포함합니다.

require와 include의 차이점 : 필요한 파일을 찾을 수 없으면 PHP는 치명적인 오류를 발생시키는 반면 include는 경고 만 발생합니다.


1
와우 짧고 간단합니다!
Vlad

31

include() 파일을 포함 할 수 없으면 경고가 발생하지만 나머지 스크립트는 실행됩니다.

require()E_COMPILE_ERROR파일을 포함 할 수없는 경우 스크립트 를 던지고 중지합니다.

include_once()require_once()이미 포함 된 경우 함수는 두 번째 파일을 포함하지 않습니다.

다음 설명서 페이지를 참조하십시오.


22

require_once()현재 파일에서 한 번만 호출 된 파일이 필요할 때 파일에서 다른 파일을 포함 하여 사용할 수 있습니다. 여기 예제에서 test1.php가 있습니다.

<?php  
echo "today is:".date("Y-m-d");  
?>  

그리고 내가 test2.php라는 다른 파일에서

<?php  
require_once('test1.php');  
require_once('test1.php');  
?>

test1 파일을 두 번 요구하는 m을 볼 때 파일에는 test1이 한 번 포함되며 두 번째 호출에는 무시됩니다. 멈추지 않으면 출력이 한 번만 표시됩니다.

'include_once ()`를 사용할 때마다 현재 파일에서 호출 된 파일이 두 번 이상 필요할 때 다른 파일을 포함하기 위해 파일에서 사용할 수 있습니다. 여기 예제에는 test3.php라는 파일이 있습니다.

<?php  
echo "today is:".date("Y-m-d");  
?> 

그리고 내가 test4.php라는 다른 파일에서

<?php  
include_once('test3.php');  
include_once('test3.php');  
?>

test3 파일을 포함하여 m이 파일을 한 번 포함하지만 추가 실행은 중단됩니다.


'더 나은 조언보다는 예를 들어'
라 메쉬 Kithsiri HettiArachchi

19

재사용 가능한 PHP 템플릿 에는 "include"를 사용하십시오 . 필수 라이브러리에는 "필수"를 사용하십시오.

"* _once"는 파일이 이미로드되어 있는지 여부를 확인하기 때문에 좋지만 "require_once"에서만 의미가 있습니다.


18

클래스 및 함수 정의를 파일로 구성해야합니다.

종속성 (클래스, 함수, 상수) require_once()을로드 하는 데 사용 합니다 .

템플릿과 유사한 파일require() 을로드하는 데 사용 합니다 .

선택적 종속성 (클래스, 함수, 상수) include_once()을로드하는 데 사용 합니다 .

선택적 템플릿 유사 파일include() 을로드하는 데 사용 합니다 .


16

2018 년 7 년 후 답변

이 질문은 7 년 전에 제기 된 것이므로 해당 질문에 대한 실질적인 도움을 제공하는 답변은 없습니다. 최신 PHP 프로그래밍에서는 주로 required_once자동 로더 클래스 (작곡가 자동 로더)를 포함하기 위해 한 번만 사용 하며 모든 클래스와 함수를로드합니다 (함수 파일은 composer.json다른 파일에서 사용 가능 하도록 파일에 명시 적으로 추가해야 함 ). 어떤 이유로 클래스를 오토로더에서로드 할 수없는 경우로드하는 require_once데 사용합니다.

우리가 사용해야 할 경우가 있습니다 require. 예를 들어, 정말로 큰 배열 정의가 있고 이것을 클래스 정의 소스 코드에 추가하지 않으려면 다음을 수행하십시오.

 <?php
// arr.php
return ['x'=>'y'];

 <?php
//main.php
$arr= require 'arry.php'

포함하려는 파일에 실행 파일이 포함되어 있거나 거의 항상 사용해야하는 일부 변수가 선언 된 require경우 require_once, 처음부터 사용 하지 않으면 코드가 실행되지 않고 변수가 자동으로 시작되지 않아 버그가 발생하기 때문에 정확히 찾기가 어렵습니다.

에 대한 실제 사용 사례가 없다 include하고 include_once정말은.


오토로더 언급에 +1 그러나 그 마지막 문장은 논쟁의 여지가 있습니다. 종종 include()출력 엔진에 래핑 된을 사용 하여 템플릿 엔진을 구현합니다.
haz

또한 최신 텍스트 편집기와 최신 PHP를 사용 require()하면 큰 파일을 분할하는 데 거의 아무도 사용하지 않습니다 .
haz

require_once함수 내에서 PHPMailer를 사용할 때도 같은 문제가 발생 했으며 자동 로더는 $mail나중에 코드에서 필요한 변수를 정의 하므로 다음 require_once은 무시되어 $mail초기화되지 않았습니다! 해결책은 단순히 require함수 호출 후에 사용하는 것이 었습니다 .
Youssef

@haz require그런 경우에 사용하지 않는 이유가 있습니까?
PHPst

@ChristofferBubach LOL.
PHPst

15

차이점은 명령이 생성하는 오류에 있습니다. 를 사용하면 require사용하려는 파일이 실제로 필요하므로 E_ERROR찾을 수없는 경우 를 생성합니다 .

require()include() 실패시 를 제외하고는 치명적 E_ERROR 수준의 오류 도 생성합니다 .

include만 생성 E_WARNING이 더 많거나 적은 침묵하는 실패 할 경우 오류가 발생했습니다.

따라서 파일이 나머지 코드를 작동 시키는데 필요하고 스크립트가 파일을 사용할 수 없게하려면이 파일을 사용하십시오.


의 경우 *_once():

include_once() 특정 스크립트를 실행하는 동안 동일한 파일이 포함되어 두 번 이상 평가 될 수있는 경우에 사용될 수 있으므로이 경우 함수 재정의, 변수 값 재 할당 등과 같은 문제를 피할 수 있습니다.

require_once()물론 동일합니다 .


참조 : require(),include_once()


requireE_ERROR가 아니라 E_COMPILE_ERROR를 제공합니다.
Yousha Aleayoub

지난 7 년 동안 바뀌었던 것 같습니다.
Felix Kling

9

require로 파일이 존재하지 않으면 오류가 표시됩니다. 반면 include-파일이 존재하지 않으면 페이지가 계속로드됩니다.


8

승인과 같은 중요한 부분이 필요하고 다른 부분은 모두 포함하십시오.

다중 포함은 매우 나쁜 디자인이므로 전혀 피해야합니다. 따라서 * _once는 중요하지 않습니다.


7

포함 / 필요 : 동일한 파일을 두 번 이상 포함 할 수 있어야합니다.

require ()는 실패시 치명적인 E_COMPILE_ERROR 레벨 오류를 생성한다는 점을 제외하면 include ()와 동일합니다. 다시 말해, 스크립트를 중지시키는 반면 include ()는 스크립트를 계속할 수있는 경고 (E_WARNING) 만 발생합니다.

require_once / include_once

PHP는 파일이 이미 포함되어 있는지 확인하고 파일이 이미 포함되어 있는지 다시 확인하지 않는 것을 제외하고는 include / require와 동일합니다.


5

include()파일을 찾지 못하면 경고 require_once()가 발생 하지만 치명적인 오류가 발생합니다.

또 다른 것은 파일이 이전에 포함 된 경우입니다. 그런 다음 require_once()다시 포함하지 않습니다.


5

나는 아래와 같은 기능을 사용하고 있었다 :

function doSomething() {
    require_once(xyz.php);
    ....
}

xyz.php에 상수 값이 선언되었습니다.

다른 PHP 스크립트 파일 에서이 doSomething () 함수를 호출해야합니다.

그러나 루프 에서이 함수를 호출하는 동안 동작을 관찰했습니다. 처음 반복 doSomething ()이에서 상수 값을 xyz.php얻었지만 나중에 모든 반복 doSomething()에서에 선언 된 상수 값을 얻을 수 없었습니다 xyz.php.

에서 require_once()include()업데이트 하여 문제를 해결 했습니다 . 업데이트 된 doSomething()코드는 다음과 같습니다.

function doSomething() {
    include(xyz.php);
    ....
}

이제 모든 반복 호출 doSomething()은에 정의 된 상수 값 을 가져옵니다 xyz.php.


4

로부터 수동 :

require()include()실패시 를 제외하고는 치명적 E_COMPILE_ERROR수준의 오류 도 생성합니다 . 다시 말해, 스크립트를 중단시키는 반면 스크립트를 계속할 수 include()있는 경고 ( E_WARNING) 만 발생합니다 .

_once()변형에 대해서도 마찬가지입니다 .


4

의 시대에 PSR-0 / PSR-4자동 로더, 당신이 필요로하는 모든 경우 코드에 일부 기능 / 클래스를 확인하기 위해 문 중 하나를 사용하여 완전히 불필요 할 수있다 (물론, 당신은 여전히 필요가 require_once부트 스트랩 파일 자체를 자동 로더 include템플릿을 사용하면 경우 여전히 템플릿 엔진으로 PHP를 사용하십시오).


3

 

  1. 때 하나를 사용해야 requireinclude?

    requireinclude기능 즉 특정 파일을 인클루드하고 있지만, 차이는, 동일한 작업을 수행 require하는 반면 지정된 파일 위치가 유효하지 않거나 오류입니다 때 치명적인 오류가 발생합니다 include경고를 생성하고 코드 실행을 계속합니다.

    따라서 require포함하려는 파일이 시스템핵심이고 나머지 코드에 큰 영향을 줄 수 있으며 include포함하려는 파일이 파일 인 경우이 기능을 사용할 수 있습니다 . 덜 중요한 코드를 포함하는 간단한 파일.

    그리고 내 개인적인 권장 사항 (덜 중요 한 코드의 경우)은 require개발 단계에있는 동안 코드의 모든 위치에서 함수를 사용하여 코드를 디버그하고 나중에 코드를 디버그 할 수 있고 나중에 require함수로 모든 함수 를 대체 include하여 프로덕션으로 옮기기 전에 누락 된 경우 최종 사용자에게 영향을 미치지 않으며 나머지 코드는 올바르게 실행되는 모든 버그 ...

  2. 때 하나를 사용해야 require_oncerequire?

    기본적인 차이 requirerequire_oncerequire_once파일이 이미 포함 여부가 벌써 포함되는 경우가있는 반면 파일을 포함하지 않을 것이다 확인할 것이다 require관계없이 파일이 이미 포함되어 있는지의 여부를 파일을 포함 기능.

    따라서 일부 코드를 반복 require해서 포함 시키려면 함수를 사용하는 반면 코드에 코드를 한 번만 포함하려면을 사용하십시오 require_once.


2
  1. 사용 이 필요합니다 당신이 모든 클래스, 함수 또는 종속성을로드 할 때 기능.

  2. 템플릿 스타일 파일을로드 할 때 포함 기능 사용

여전히 혼란 스러우면 항상 require_once 를 사용하십시오 .


1

그것들은 파일을 포함하는 모든 방법입니다.

필요는 그것이 필요하다는 것을 의미합니다. Require_once는 필요하지만 한 번만 필요함을 의미합니다. 포함은 파일을 포함하지만 계속할 필요는 없음을 의미합니다.

예 :

Require 'filename'
Require_once 'filename'
Include 'filename'

파일을 한 번 포함하는 include_once 함수도 있습니다.

Include_once 'filename'

휴대폰에서 입력 할 때 대문자를 사용하지 마십시오.


1

내가 주목 한 것은 include를 사용할 때 포함 된 파일에서만 포함 된 파일 기능에 액세스 할 수 있다는 것입니다. require_once를 사용하면 두 번째 required_once 파일에서 해당 기능을 실행할 수 있습니다.

또한 : 나는 추가하는 것이 좋습니다

if(file_exists($RequiredFile)){
    require_once($RequiredFile);
}else{
  die('Error: File Does Not Exist');
}

require_once가 페이지를 종료하면 때때로 웹 사이트 파일의 디렉토리를 에코 할 수 있습니다.

파일을 요구하기 위해 만든 사용자 정의 함수는 다음과 같습니다.

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;
    }
}

사용 예 :

$success = addFile('functions/common');

if($success){
    commonFunction();
}else{
    fallbackFunction();
}

0

기본적으로 잘못된 경로가 필요한 경우 PHP에서 치명적인 오류가 발생하고 종료 기능이 호출되지만 잘못된 경로를 포함하면 PHP는 계속 실행되지만 파일이 존재하지 않는다는 경고 만 표시합니다.

영어 단어 require 에서 PHP는 페이지 또는 파일의 실행이 필요한 파일에 따라 다르다는 것을 알려줍니다.

내 경험상, 구성 파일, 데이터베이스 클래스 및 기타 중요한 유틸리티와 같은 중요한 파일이 필요합니다.


0

클라이언트 라이브러리를 조건부로로드할지, 사용하든 원하지 않든로드할지 여부는 종종 문제입니다.

구체적인 예는 다음과 같습니다. pcj가 말한 내용을 자세히 설명합니다.

데이터베이스 사용자 이름 및 비밀번호 (conf.php)를 저장하는 구성 파일이 있다고 가정하십시오.

<?php
//my site configuration file

//For Database
$location='localhost';
$dbuser='yourname';
$userpw='yourpassword';
$database='nameofdatabase';
?>

그리고 데이터베이스를 사용하는 정적 함수가있는 클래스 :

<?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
    }
}
?>

그리고 정적 함수는 루프 내에서 반복적으로 호출되는 다른 함수 내에서 사용됩니다.

<?php
require_once('path/to/arbitraryObject.php');  //either will likely be OK at this level
$obj = new arbitraryObject();
foreach($array as $element){
    $obj->myFunction();
}
?>

수업은 한 번만 요구 / 포함 할 수 있습니다. 루프를 반복 할 때마다이를 포함 / 포함하면 오류가 발생합니다. 그러나 정적 함수가 호출 될 때마다 conf 파일을 포함시켜야합니다.

<?php
class arbitraryObject {
    public function myFunction(){
        require_once(/path/to/UsedInLoop.php);   //This must be require_once. require() will not work
        UsedInLoop::databaseQuery();
    }
}
?>

물론 함수 외부로 그것을 옮기는 것이 그 문제에 대한 해결책이 될 수 있습니다.

<?php
require(/path/to/UsedInLoop.php);   //now require() is fine   
class arbitraryObject {
    public function myFunction(){
        UsedInLoop::databaseQuery();
    }
}
?>

특정 조건에서만 사용할 수있는 클래스를로드하는 오버 헤드에 관심이없고 그렇지 않은 경우로드하지 않으려는 경우가 아니면.


-1

requireinclude파일을 먼저 구문 분석해야하기 때문에 보다 큰 오버 헤드가 있습니다. 교체 requires와 함께하는 것은 includes종종 좋은 최적화 기법이다.


2
나는 그것이 늦은 의견이라는 것을 알고 있지만 실제로는 그렇지 않습니다. require파일을 더 이상 구문 분석하지 않습니다 include. _once이러한 기능 의 버전은 각각 약간의 오버 헤드가 있지만 다른 사람들이 말했듯이 대부분의 응용 프로그램에서는 무시할 수 있습니다.
ahouse101

-2

그냥 사용하고 포함하십시오.

include_once 또는 require_once로 작업하는 방법을 생각하십시오. 그것은 포함되거나 필요한 PHP 파일을 저장하는 로그 데이터를 찾고 있습니다. 따라서 포함 및 요구보다 느립니다.

if (!defined(php)) {
    include 'php';
    define(php, 1);
}

이렇게 사용하면 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.