>백엔드 개발 >PHP 튜토리얼 >PHP 자동로드 사용법 요약

PHP 자동로드 사용법 요약

怪我咯
怪我咯원래의
2017-07-06 10:47:091341검색

PHP에서 클래스를 사용하는 경우 require 또는 include를 통해 사용하기 전에 로드해야 하지만 로드 결정에 영향을 미치는 두 가지 문제가 있습니다.

PHP에서는 Autoload가 제공되어 파일을 포함하는 것이 편리하지만 자동 로드는 예상대로 모든 상황을 처리할 수 없습니다. 오늘은 며칠 전에 겪었던 자동 로드 관련 문제를 기록해 보겠습니다.

Autoload를 사용하는 이유

PHP에서 클래스를 사용할 때 require를 통해서든 include를 통해서든 사용하기 전에 먼저 로드해야 하는데 로딩에 영향을 미치는 두 가지 문제가 있습니다.

첫째는 이 클래스 파일이 어디에 저장되어 있는지 모르겠고, 둘째는 이 파일을 언제 사용해야 할지 모르겠습니다. 특히 프로젝트 파일이 많은 경우 각 파일의 시작 부분에 긴 require 문자열을 쓰는 것은 불가능합니다...

PHP5 이후에는 자동 로드를 통해 이 문제를 해결할 수 있습니다. 그리고 PHP5.1 이후에는 보다 완전한 로딩 메커니즘을 제공하기 위해 spl_autoload_register()도 제공됩니다.

PHP에서 자동 로드 기사를 읽은 후, 클래스가 new를 통해 인스턴스화되면 PHP는 정의된 자동 로드 함수를 통해 해당 파일을 로드합니다. 이 클래스 파일이 extends를 사용하는 경우 또는 구현에 필요한 경우. 다른 클래스 파일을 사용하기 위해 PHP는 자동 로드를 다시 실행하여 클래스 파일을 검색하고 로드합니다. 동일한 클래스 파일에 대한 요청이 두 개 있으면 오류가 보고됩니다. 원본 기사의 작성자는 이 문제를 설명하기 위해 세 가지 매우 흥미로운 예를 제공했으며, 여기에서 소스 코드를 다운로드하여 볼 수 있습니다.

일반적으로 로딩 시 해당 위치에서 파일을 찾는 문제를 해결하는 방법은 여러 가지가 있습니다. 가장 일반적으로 사용되는 것은 특정 명명 표준을 지정하는 것입니다.

Zend의 방법

zend는 가장 널리 사용되는 방법 중 하나인 파일 이름에 경로를 포함하는 방법을 권장합니다. 예를 들어 다음 예는 다음과 같습니다.

// Main.class

function autoload($class_name) {
$path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);
require_once $path.'. php'
}

$temp = new Main_Super_Class(); 위의 예에서는 Main/Super/Class.php 파일이 사용됩니다. 이 방법의 단점은 다음과 같습니다. 인코딩 과정에서 코드 파일이 어디에 위치해야 하는지 명확히 알아야 하며,

클래스 이름에 파일 경로를 하드코딩하기 때문에 폴더 구조를 수정해야 할 경우 모든 클래스를 수동으로 수정해야 합니다. 이름.

'모두 포함' 방법개발 환경에 있고 속도에 크게 관심이 없다면 이 방법을 사용하는 것이 매우 편리합니다. 모든 클래스 파일을 하나 또는 여러 개의 특정 폴더에 배치한 다음 순회하여 찾아서 로드합니다.

예:


코드는 다음과 같습니다.

<?php 
  $arr = array ( 
    &#39;Project/Classes&#39;, 
    &#39;Project/Classes/Children&#39;, 
    &#39;Project/Interfaces&#39; 
  );
  foreach($arr as $dir) { 
    $dir_list = opendir($dir);
    while ($file = readdir($dir_list)) { 
      $path = $dir.DIRECTORY_SEPARATOR.$file; 
      if(in_array($file, array(&#39;.&#39;, &#39;..&#39;)) || is_dir($path)) 
        continue;
      if (strpos($file, ".class.php")) 
        require_once $path; 
    } 
  } 
?>

파일 및 위치 연결또 다른 방법은 클래스 파일을 해당 위치와 연결하는

구성 파일

을 설정하는 것입니다. 예:
코드는 다음과 같습니다.

// configuration.php 
array_of_associations = array( 
  &#39;MainSuperClass&#39; = &#39;C:/Main/Super/Class.php&#39;, 
  &#39;MainPoorClass&#39; = &#39;C:/blablabla/gy.php&#39; 
);


이라는 파일의 코드는 다음과 같습니다.

<?php 
  require &#39;autoload_generated.php&#39;;
  function autoload($className) { 
    global $autoload_list; 
    require_once $autoload_list[$className]; 
  }
  $x = new A(); 
?>

물론 파일이 너무 많으면 유지관리가 번거롭겠지만 하드보다는 어떤 것이 나을까요? -클래스 이름에 위치를 코딩하나요?

물론 이 목록을 수동으로 유지하고 싶지 않으므로 이 파일의 자동 생성을 사용하여 해당 파일을 phpxmljson 등으로 만들 수 있습니다. 원본 기사의 저자는 이러한 도구를 구현했습니다. 잘 생각해 보면 구현하기가 어렵지 않습니다. 원본 기사의 저자는 학습할 가치가 있는 작은 Autoload 프레임워크도 개발했습니다.

위 내용은 PHP 자동로드 사용법 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.