>  기사  >  백엔드 개발  >  PHP의 포함 및 요구 사항을 철저히 이해하십시오!

PHP의 포함 및 요구 사항을 철저히 이해하십시오!

藏色散人
藏色散人앞으로
2021-02-17 09:07:173393검색

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代码
  • 이제 우리는 include 및 require에 대해 매우 깊이 있게 이해했습니다. . 파일을 로드하는 두 가지 방법은 복잡하지는 않지만 몇 가지 함정이 있기 쉽습니다. 특히 _once를 메서드에 사용할 때는 특별한 주의가 필요합니다. 마지막으로, 작은 보너스로 디렉터리의 모든 파일을 한 번에 로드하는 방법을 캡슐화합니다:
  • 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

    위 내용은 PHP의 포함 및 요구 사항을 철저히 이해하십시오!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제