PHP에는 외부 파일을 포함하는 두 가지 방법, 즉 include와 require가 있습니다. 그들 사이의 차이점은 무엇입니까?
파일이 없거나 오류가 발생하면 require는 E_COMPILE_ERROR 수준 오류를 생성하고 프로그램 실행을 중지합니다. 포함하면 경고만 생성되며 스크립트는 계속 실행됩니다.
이것이 다른 측면에서 require와 include의 주요 차이점입니다.
- 포함된 파일은 먼저 매개변수에 지정된 경로에 따라 검색됩니다. 디렉터리가 지정되지 않은 경우(파일 이름만) include_path에 지정된 디렉터리에 따라 검색됩니다. include_path에 파일이 없으면 include는 호출 스크립트 파일이 있는 디렉터리와 현재 작업 디렉터리에서 최종적으로 검색합니다
- 경로가 정의되어 있으면 현재 디렉터리에 대한 절대 경로인지 상대 경로인지 , include_path는 완전히 무시됩니다
- include_path php.ini에 정의됨
- 파일이 포함되면 파일에 포함된 코드는 포함이 있는 줄의 변수 범위를 상속합니다. 그 시점부터 해당 줄의 호출 파일에서 사용할 수 있는 모든 변수는 호출된 파일에서도 사용할 수 있습니다. 그러나 포함 파일에 정의된 모든 함수와 클래스에는 일반 require 및 include 외에 require_once 및 include_once도 있습니다. 해당 기능은 다음과 같습니다.
파일이 이미 포함된 경우 다시 포함되지 않습니다. . 이 명령문의 이름에서 알 수 있듯이, only include Once
- 는 스크립트 실행 중에 동일한 파일이 두 번 이상 포함될 수 있고 함수 재정의 및 변수 재할당을 피하기 위해 한 번만 포함되도록 하려는 경우에 사용할 수 있습니다. 질문
- 몇 가지 예를 살펴보겠습니다.
// a.php 不存在 include "a.php"; // warning // require "a.php"; // error echo 111; // 使用include时111会输出 // file1.php 中只有一行代码echo 'file1'; require_once 'includeandrequire/file1.php'; // file1 require_once 'includeandrequire/file1.php'; // noting include_once 'includeandrequire/file1.php'; // noting include_once 'includeandrequire/file1.php'; // noting require 'includeandrequire/file1.php'; // file1 require 'includeandrequire/file1.php'; // file1 require 'includeandrequire/file1.php'; // file1 require 'includeandrequire/file1.php'; // file1첫 번째 _once가 성공적으로 로드된 후에는 require_once 또는 include_once에 관계없이 이 파일이 다시 로드되지 않음을 알 수 있습니다. _once가 없으면 파일이 반복적으로 로드됩니다.
file2.php <?php echo 'file2:' . $a, PHP_EOL; echo 'file2:' . $b, PHP_EOL; $b = "file2"; myFile.php <?php $a = 'myFile'; $b = 'youFile'; require_once 'includeandrequire/file2.php'; echo $a, PHP_EOL; echo $b, PHP_EOL; // 输出结果 // file2:myFile // file2:youFile // myFile // file2 file3.php <?php $c = 'file3'; myFile.php <?php function test(){ require_once 'includeandrequire/file3.php'; echo $c, PHP_EOL; // file3 } test(); echo $c, PHP_EOL; // empty포함된 파일은 상위 파일의 변수를 가져올 수 있고, 상위 파일도 포함된 파일의 변수를 가져올 수 있습니다. 하지만 _once의 특별한 경우에 주의해야 합니다.
function foo(){ require_once 'includeandrequire/file3.php'; return $c; } for($a=1;$a<=5;$a++){ echo foo(), PHP_EOL; } // file3 // empty // empty // empty // empty_once를 사용하고 루프에서 로드하면 처음으로 file3.php의 내용만 출력됩니다. 이유는 무엇입니까? 현재 변수 범위가 메서드에 있으므로 첫 번째 로드가 완료된 후에는 후속 파일이 다시 로드되지 않습니다. 이때 다음 4개의 루프에서는 $c가 정의되지 않으며 기본적으로 $c는 비어 있습니다. 두 가지 방법으로 동시에 _once를 사용하여 파일을 로드하는 경우 두 번째 방법으로도 파일을 로드할 수 있나요?
function test1(){ require_once 'includeandrequire/file1.php'; } function test2(){ require_once 'includeandrequire/file1.php'; } test1(); // file1 test2(); // empty죄송합니다. 첫 번째 방법만 성공적으로 로드되며 두 번째 방법은 다시 로드되지 않습니다. 그렇다면 일상적인 개발에 어떤 것이 더 좋을까요?
효율성 측면에서 _once는 파일이 로드되었는지 확인해야 합니다. 효율성은 떨어지겠지만, 눈에 보이지 않는 정도의 감소이므로 효율성 문제가 발생할 수 있습니다. 무시되었습니다. 그리고 _once가 없는 것보다 훨씬 더 많은 이점을 제공합니다
- 미리 오류의 원칙을 바탕으로 require_once를 사용하는 것이 좋습니다. 경고를 표시하지 않도록 PHP 오류 수준을 조정한 후에는 포함 경고 정보가 표시되지 않으므로 예측할 수 없는 오류가 발생할 수 있습니다. 특히 이 파일을 로드해야 하는 경우 _once를 사용하여 파일을 로드하면 안 됩니다. 여러 클래스나 메소드에서 _once를 사용하면 후속 메소드에서 동일한 파일을 로드할 수 없게 될 수 있습니다
- require 또는 include를 사용할 때 실제로는 include(' xxx.php'); 시스템 메소드가 아닌 표현식 키워드이므로 include 'xxx.php'를 사용하세요.
- include 및 require 파일에 반환이 있는 경우 변수를 사용하여 retun에서 반환된 데이터를 받을 수 있습니다. 또한 다음과 같이 PHP가 아닌 파일과 원격 파일을 로드할 수도 있습니다(원격 로딩을 위해서는 php.ini의 허용_url_include가 켜져 있는지 확인해야 함).
file4.php <?php return 'file4'; file4.txt 可以吧 myFile.php <?php $v = require 'includeandrequire/file4.php'; echo $v, PHP_EOL; // file4 include 'includeandrequire/file4.txt'; // 可以吧 include 'https://www.baidu.com/index.html'; // 百度首页的html代码
function include_all_once ($pattern) { foreach (glob($pattern) as $file) { require $file; } } include_all_once('includeandrequire/*');
测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%98%8E%E7%99%BDPHP%E4%B8%AD%E7%9A%84include%E5%92%8Crequire.php