>  기사  >  백엔드 개발  >  PHP 자동 로딩 메커니즘에 대한 심층 연구

PHP 자동 로딩 메커니즘에 대한 심층 연구

伊谢尔伦
伊谢尔伦원래의
2017-07-01 09:59:411982검색

이 글은 php자동 로딩메커니즘에 대한 자세한 분석과 소개입니다. 필요한 친구들은 참고하시면 됩니다

1. php
에서 자동 로딩을 구현하는 방법 1. require_once , include_once수동으로 로드하세요. 2. 자동 로드를 위해 자동 로드 사용
3. 자동 로드를 위해 spl의 자동 로드 사용
수동 로드 구현:

로드할 파일이 적을 경우 첫 번째 파일을 사용하여 완료할 수 있습니다. 그렇게 하는 것은 쉽고 문제가 없습니다.


코드는 다음과 같습니다

require_once 'a.php';
require_once 'b.php';
require_once 'c.php';

그런데 로딩할 파일이 많은데 이게 괜찮을까요? 10, 20 require_one 또는 그 이상을 작성해야 할 경우 어떻게 해야 합니까?

이때 자동 로드 방법을 사용하여 코드를 단순화할 수 있습니다.

자동 로드 로딩 구현:
테스트 디렉토리에 다음 내용으로 in.php 파일을 생성합니다.

코드는 다음과 같습니다.

echo &#39;我是test下面的in.php<br />&#39;;

그런 다음 테스트 디렉터리에 다음 내용으로 loader.php를 만듭니다.


코드는 다음과 같습니다:

// 需要重载autoload方法,自定义包含类文件的路径  
function autoload($classname)  
{  
 $class_file = strtolower($classname).".php";  
 if (file_exists($class_file)){  
  require_once($class_file);  
 }  
}
@$test = new in(); // 执行到这里会输出 <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">我是test下面的in.php</SPAN>

문제 없습니다. 작동했습니다! 로딩을 위해 다른 파일을 생성할 수도 있지만, 필요한 파일이 많아 디렉토리로 나누어야 할 경우 어떻게 해야 할까요?

이때 로드할 파일을 찾기 위해 매핑을 사용하도록 loader.php를 수정해야 합니다.


코드는 다음과 같습니다.

function autoload($class_name) {
 $map = array(
  &#39;index&#39; => &#39;./include/index.php&#39;,
  &#39;in&#39; => &#39;./in.php&#39;
 );
    if (file_exists($map[$class_name]) && isset($map[$class_name])) {
        require_once $map[$class_name];
    }
}
new index();

이 방법의 장점은 클래스 이름과 파일 경로가 매핑으로만 유지되므로 파일 구조가 변경될 때 클래스 이름을 수정할 필요가 없으며, 매핑에서 해당 항목만 수정하면 됩니다. 괜찮습니다.

하지만 자동 로드는 한 프로젝트에서 한 번만 사용할 수 있습니다. 귀하의 프로젝트가 다른 사람의 프로젝트를 참조하는 경우 귀하의 프로젝트에도 자동 로드가 있고 다른 사람의 프로젝트에도 자동 로드가 있으므로 두 가지 자동 로드가 충돌합니다. 이는 의심할 여지 없이 매우 번거롭고 단일 애플리케이션 시나리오를 갖습니다.

spl의 자동 로드 로딩 구현:
spl의 자동 로드 기능 시리즈는 자동 로드 호출 스택을 사용하여 spl_autoload_register를 사용하여 다양한 애플리케이션 시나리오에서 여러 사용자 정의 자동 로드 기능을 등록할 수 있습니다.


• test 디렉터리 test 디렉터리 아래에 다음 내용으로 in.php를 생성합니다

코드는 다음과 같습니다.

<?php
class in {
 public function index() {
  echo &#39;我是test下面的in.php&#39;;
 }
}
?>

test 디렉터리 아래에 다음 내용으로 loader.php를 생성합니다

코드는 다음과 같습니다

<?php
set_include_path("/var/www/test/"); //这里需要将路径放入include
spl_autoload("in"); //寻找/var/www/test/in.php
$in = new in();
$in->index();

•spl_autoload_register는 SPL 자동 로드 함수 스택에 함수를 등록하고, loader.php

코드는 다음과 같습니다.

function AutoLoad($class){
    if($class == &#39;in&#39;){
        require_once("/var/www/test/in.php");
    }
}
spl_autoload_register(&#39;AutoLoad&#39;);
$a = new in();
$a->index();

•spl_autoload_register는 여러 사용자 정의 자동 로드 함수의 응용 프로그램을 등록합니다
먼저 mods 폴더를 생성합니다 test 디렉터리를 만들고 다음 내용으로 inmod.mod.php를 만듭니다.

코드는 다음과 같습니다.

<?php
class inmod
{
 function construct()
 {
  echo &#39;我是mods下的in&#39;;
 }
}

그런 다음 test 디렉터리에 libs 폴더를 만들고 다음 내용으로 inlib.lib.php를 만듭니다.

코드는 다음과 같습니다.

<?php
class inlib
{
 function construct()
 {
  echo &#39;我是libs下的in&#39;;
 }
}

마지막으로 다음 내용으로 테스트 디렉터리에 loader.php를 생성합니다

코드는 다음과 같습니다

<?php
class Loader {
    /**
    * 
自动加载类
    * @param $class 类名
    */
    public static function mods($class) {
        if($class){
   set_include_path( "/var/www/test/mods/" );
   spl_autoload_extensions( ".mod.php" );
   spl_autoload( strtolower($class) );
        }
    }
    public static function libs($class) {
  if($class){
   set_include_path( "/var/www/test/libs/" );
   spl_autoload_extensions( ".lib.php" );
   spl_autoload( strtolower($class) );
        }
    }
}
spl_autoload_register(array(&#39;Loader&#39;, &#39;mods&#39;));
spl_autoload_register(array(&#39;Loader&#39;, &#39;libs&#39;));
new inmod();//输出<SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是mods下的in</SPAN>
new inlib();//<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">输出</SPAN><SPAN style="FONT-FAMILY: &#39;Times New Roman&#39;; FONT-SIZE: 14px">我是libs下的in</SPAN>

위 내용은 PHP 자동 로딩 메커니즘에 대한 심층 연구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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