>  기사  >  백엔드 개발  >  두 가지 PHP 자동 로딩 기능에 대한 자세한 설명

두 가지 PHP 자동 로딩 기능에 대한 자세한 설명

零到壹度
零到壹度원래의
2018-04-11 13:34:332069검색

ThinkPHP 프레임워크를 사용할 때 소스 코드를 보면 __autoload와 apl_autoload_register라는 두 가지 함수를 볼 수 있는데, 이 두 함수는 자동 로딩에 사용됩니다. 주요 기능은 소스 코드 파일이 로드되지 않은 파일을 사용할 때 이 두 함수가 실행되어 언로드된 파일을 로드하는 것입니다. PHP의 __autoload 함수는 이 함수가 나타나기 전에는 마법의 함수입니다. 파일이 100개의 개체를 참조하면 이 파일은 100개의 클래스 파일을 포함하거나 도입해야 하므로 PHP 파일이 매우 커집니다. 그래서 이 __autoload 함수가 있습니다.

__autoload 함수는 언제 호출되나요?

객체를 인스턴스화하기 위해 PHP 파일에서 new 키워드를 사용할 때, 이 PHP 파일에 클래스가 정의되어 있지 않으면 __autoload 함수가 트리거됩니다. 이때 클래스를 정의하는 PHP 파일이 도입될 수 있습니다. 그런 다음 인스턴스화가 성공합니다. (참고: 이 파일에서 인스턴스화해야 할 객체가 발견되고 클래스 정의가 발견되면 __autoload 함수가 실행되지 않습니다.)

#Animal.php<?php
   class Animal{}?>
#main.php<?php
  function __autoload($classname){
     $classpath = "{$classname}.php";     if(file_exists($classpath)){         require_once($classpath);
     }else{         echo $classpath." not be found!";
     }
  }  $ani = new Animal();?>

위 두 파일처럼 php main.php를 실행하세요

(1) 다음으로 실행 new Animal() 클래스가 정의되지 않은 것으로 나타났습니다.

(2)는 Animal.php 파일을 도입한 __autoload 함수를 트리거했습니다.
(3) 인스턴스화에 성공했습니다.
자, 이제 __autoload 함수의 역할을 이해했으니 spl_autoload_register 함수의 역할을 살펴보겠습니다.
spl_autoload_register 함수의 역할은 사용자 정의 함수 설정을 __autoload 함수로 바꾸는 것입니다(참고: __autoload와 spl_autoload_register가 파일에 동시에 나타나면 spl_autoload_register가 우선합니다).
그런 다음 main.php를 다음과 같이 변경하면 동일한 효과:

#main.php<?php
  function myLoad($classname){
     $classpath = "{$classname}.php";     if(file_exists($classpath)){         require_once($classpath);
     }else{         echo $classpath." not be found!";
     }
  }
  spl_autoload_register("myLoad");  $ani = new Animal();?>

t가 THINKPHP 프레임워크를 사용할 때 소스 코드를 확인하여 __autoload 및 APL_AUTOLOAD_register의 두 가지 기능을 사용하고 이 두 기능은 자동 로딩에 사용됩니다. gavin_new/article/details/52805811

주요 기능은 다음과 같습니다. 소스 코드 파일이 로드되지 않은 파일을 사용할 때 이 두 함수는 언로드된 파일을 로드하기 위해 트리거됩니다.

PHP의 __autoload 함수는 Magic 함수입니다. 이 함수가 나타나기 전에는 PHP 파일에서 100개의 객체를 참조한 경우, 그런 다음 파일은 100개의 클래스 파일을 도입하기 위해 include 또는 require를 사용해야 하며, 이로 인해 PHP 파일이 매우 커질 수 있습니다. 그래서 이 __autoload 함수가 있습니다.


__autoload 함수는 언제 호출되나요?

객체를 인스턴스화하기 위해 PHP 파일에서 new 키워드를 사용할 때, 이 PHP 파일에 클래스가 정의되어 있지 않으면 __autoload 함수가 트리거됩니다. 이때 클래스를 정의하는 PHP 파일이 도입될 수 있습니다. 그런 다음 인스턴스화가 성공합니다. (참고: 이 파일에서 인스턴스화해야 할 객체가 발견되고 클래스 정의가 발견되면 __autoload 함수가 실행되지 않습니다.)

#Animal.php<?php
   class Animal{}?>
#main.php<?php
  function __autoload($classname){
     $classpath = "{$classname}.php";     if(file_exists($classpath)){         require_once($classpath);
     }else{         echo $classpath." not be found!";
     }
  }  $ani = new Animal();?>

위 두 파일처럼 php main.php를 실행하세요

(1) 다음으로 실행 new Animal() 클래스가 정의되지 않은 것으로 나타났습니다.

(2)는 Animal.php 파일을 도입한 __autoload 함수를 트리거했습니다.

(3) 인스턴스화에 성공했습니다.

자, 이제 __autoload 함수의 역할을 이해했으니 spl_autoload_register 함수의 역할을 살펴보겠습니다.
spl_autoload_register 함수의 역할은 사용자 정의 함수 설정을 __autoload 함수로 바꾸는 것입니다. (참고: __autoload와 spl_autoload_register가 파일에 동시에 나타나면 spl_autoload_register가 우선합니다.)
그런 다음 main.php를 다음과 같이 변경하면 같은 효과:

#main.php<?php
  function myLoad($classname){
     $classpath = "{$classname}.php";     if(file_exists($classpath)){         require_once($classpath);
     }else{         echo $classpath." not be found!";
     }
  }
  spl_autoload_register("myLoad");  $ani = new Animal();?>

위 내용은 두 가지 PHP 자동 로딩 기능에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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