PHP에서 :
- 언제
require
vs.를 사용해야include
합니까? - 언제
require_once
vs.를 사용해야include_once
합니까?
PHP에서 :
require
vs.를 사용해야 include
합니까?require_once
vs.를 사용해야 include_once
합니까?답변:
있다 require
및 include_once
뿐만 아니라.
그래서 당신의 질문은 ...
require
vs.를 사용해야 include
합니까?require_once
vs.를 사용해야합니까require
require () 함수는 오류를 다르게 처리한다는 점을 제외하면 include ()와 동일합니다. 오류가 발생하면 include () 함수가 경고를 생성하지만 스크립트는 계속 실행됩니다. require ()는 치명적인 오류를 생성하고 스크립트가 중지됩니다.
require_once () 문은 require ()와 동일합니다. 단, PHP는 파일이 이미 포함되어 있는지 확인하고, 포함되어 있으면 다시 포함시키지 않아야합니다.
require_once()
둘 중 더 빠를 것입니다.
사용하다
필요
파일이 때 필요한 응용 프로그램에서 중요한 메시지 템플릿 또는 응용 프로그램이 중단 것이다없이 파일을 포함하는 구성 변수를 예.
파일에 후속 포함시 오류가 발생하는 내용이 포함 된 경우 require_once ( 예 :
function important() { /* important code */}
응용 프로그램에 반드시 필요하지만 함수를 다시 선언 할 수 없으므로 다시 포함하지 않아야 함)
파일이 필요하지 않을 때 포함 하고 응용 프로그램 흐름을 찾을 수 없을 때 계속해야합니다. 예를 들어
현재 범위 또는 변수에서 변수를 참조하는 템플릿에 적합합니다.
후속로드시 오류를 발생 시키거나 HTTP 오버 헤드로 인해 두 번 발생하지 않는 원격 파일 포함을 포함하는 include_once 선택적 종속성
그러나 기본적으로 어느 것을 사용할지는 당신에게 달려 있습니다.
include
? include_once
? require
? require_once
?
내 제안은 require_once
시간의 99.9 %를 사용하는 것입니다.
사용 require
또는 include
대신에 당신의 코드가 당신이 당기는있는 스크립트가 실제로 재사용 다른 곳, 즉 아니라는 것을 의미한다 실행 하고 대신 코드를 사용할 수 클래스 또는 일부 함수 라이브러리를.
그 자리에서 실행되는 코드가 필요하거나 포함되어 있다면 절차 코드이므로 새로운 패러다임을 알아야합니다 . 객체 지향 프로그래밍, 함수 기반 프로그래밍 또는 기능 프로그래밍과 유사합니다.
이미 OO 또는 함수형 프로그래밍을 수행하는 경우 스택에서 버그 / 오류가 발견되는 위치 include_once
를 사용 하면 대부분 지연 됩니다. do_cool_stuff()
나중에 호출 할 때 함수 를 사용할 수 없거나 라이브러리를 요구하여 함수 를 사용할 수 있는 순간을 알고 싶습니까? 일반적으로 필요하고 기대하는 것을 사용할 수없는 경우 즉시 아는 것이 가장 좋습니다 require_once
.
또는 현대 OOP에서는 사용시 클래스를 자동로드 하십시오.
include
가족이 일반적으로 나쁜 나쁜 생각이며 (존재하지 않을 가능성이있는 파일을 포함하는 것은 매우 드물기 때문에) require_once
및 require
에서 또는 함수 또는 클래스를 정의하는require_once
파일을 포함 할 때 사용해야한다는 것입니다 다른 곳에서 사용하거나 데이터베이스 연결 객체와 같은 싱글 톤을 인스턴스화 하고 포함되면 즉시 작업을 수행 하는 파일을 포함 하는 데 사용 됩니다. 모든 대형 웹 응용 프로그램에서 후자의 종류는 포함되지 않습니다. require
require_once
거의 모든 시간에 현명하게 사용될 가능성이 높다는 데 동의 하십시오. 선택 사항 사이에 약간의 오버 헤드 차이가 있으므로 require
스크립트 중지를 보장하므로 파일을 포함하지 않고 응용 프로그램이 생존 할 수있는 많은 시나리오를 생각할 수 없습니다. 그리고 _once
속임수 문제로부터 보호합니다. 동의하지 않는 사람은 자신이 무엇을하고 있는지 알기 때문에 응용 프로그램이나 시나리오에 적합한 것을 선택할 수 있습니다.
include()
파일을 포함 할 수 없으면 경고가 발생하지만 나머지 스크립트는 실행됩니다.
require()
E_COMPILE_ERROR
파일을 포함 할 수없는 경우 스크립트 를 던지고 중지합니다.
include_once()
과 require_once()
이미 포함 된 경우 함수는 두 번째 파일을 포함하지 않습니다.
다음 설명서 페이지를 참조하십시오.
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이 파일을 한 번 포함하지만 추가 실행은 중단됩니다.
클래스 및 함수 정의를 파일로 구성해야합니다.
종속성 (클래스, 함수, 상수) require_once()
을로드 하는 데 사용 합니다 .
템플릿과 유사한 파일require()
을로드하는 데 사용 합니다 .
선택적 종속성 (클래스, 함수, 상수) include_once()
을로드하는 데 사용 합니다 .
선택적 템플릿 유사 파일include()
을로드하는 데 사용 합니다 .
이 질문은 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
정말은.
include()
출력 엔진에 래핑 된을 사용 하여 템플릿 엔진을 구현합니다.
require()
하면 큰 파일을 분할하는 데 거의 아무도 사용하지 않습니다 .
require_once
함수 내에서 PHPMailer를 사용할 때도 같은 문제가 발생 했으며 자동 로더는 $mail
나중에 코드에서 필요한 변수를 정의 하므로 다음 require_once
은 무시되어 $mail
초기화되지 않았습니다! 해결책은 단순히 require
함수 호출 후에 사용하는 것이 었습니다 .
require
그런 경우에 사용하지 않는 이유가 있습니까?
차이점은 명령이 생성하는 오류에 있습니다. 를 사용하면 require
사용하려는 파일이 실제로 필요하므로 E_ERROR
찾을 수없는 경우 를 생성합니다 .
require()
include()
실패시 를 제외하고는 치명적E_ERROR
수준의 오류 도 생성합니다 .
include
만 생성 E_WARNING
이 더 많거나 적은 침묵하는 실패 할 경우 오류가 발생했습니다.
따라서 파일이 나머지 코드를 작동 시키는데 필요하고 스크립트가 파일을 사용할 수 없게하려면이 파일을 사용하십시오.
의 경우 *_once()
:
include_once()
특정 스크립트를 실행하는 동안 동일한 파일이 포함되어 두 번 이상 평가 될 수있는 경우에 사용될 수 있으므로이 경우 함수 재정의, 변수 값 재 할당 등과 같은 문제를 피할 수 있습니다.
require_once()
물론 동일합니다 .
참조 : require()
,include_once()
require
E_ERROR가 아니라 E_COMPILE_ERROR를 제공합니다.
나는 아래와 같은 기능을 사용하고 있었다 :
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
.
때 하나를 사용해야 require
나 include
?
require
및 include
기능 즉 특정 파일을 인클루드하고 있지만, 차이는, 동일한 작업을 수행 require
하는 반면 지정된 파일 위치가 유효하지 않거나 오류입니다 때 치명적인 오류가 발생합니다 include
경고를 생성하고 코드 실행을 계속합니다.
따라서 require
포함하려는 파일이 시스템 의 핵심이고 나머지 코드에 큰 영향을 줄 수 있으며 include
포함하려는 파일이 파일 인 경우이 기능을 사용할 수 있습니다 . 덜 중요한 코드를 포함하는 간단한 파일.
그리고 내 개인적인 권장 사항 (덜 중요 한 코드의 경우)은 require
개발 단계에있는 동안 코드의 모든 위치에서 함수를 사용하여 코드를 디버그하고 나중에 코드를 디버그 할 수 있고 나중에 require
함수로 모든 함수 를 대체 include
하여 프로덕션으로 옮기기 전에 누락 된 경우 최종 사용자에게 영향을 미치지 않으며 나머지 코드는 올바르게 실행되는 모든 버그 ...
때 하나를 사용해야 require_once
나 require
?
기본적인 차이 require
및 require_once
인 require_once
파일이 이미 포함 여부가 벌써 포함되는 경우가있는 반면 파일을 포함하지 않을 것이다 확인할 것이다 require
관계없이 파일이 이미 포함되어 있는지의 여부를 파일을 포함 기능.
따라서 일부 코드를 반복 require
해서 포함 시키려면 함수를 사용하는 반면 코드에 코드를 한 번만 포함하려면을 사용하십시오 require_once
.
내가 주목 한 것은 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();
}
클라이언트 라이브러리를 조건부로로드할지, 사용하든 원하지 않든로드할지 여부는 종종 문제입니다.
구체적인 예는 다음과 같습니다. 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();
}
}
?>
특정 조건에서만 사용할 수있는 클래스를로드하는 오버 헤드에 관심이없고 그렇지 않은 경우로드하지 않으려는 경우가 아니면.