참고링크:
1. spl_autoload_register와 autoload의 차이점에 대한 자세한 설명
2.php.net 자동 로딩 클래스
객체 지향 애플리케이션을 작성할 때 많은 개발자는 각 클래스 정의에 대해 PHP 소스 파일을 만듭니다. 각 스크립트의 시작 부분에 포함 파일의 긴 목록(클래스당 하나의 파일)을 작성해야 한다는 점은 큰 성가신 일입니다.
PHP 5에서는 더 이상 필요하지 않습니다. 아직 정의되지 않은 클래스를 사용하려고 할 때 자동으로 호출되는 __autoload() 함수를 정의할 수 있습니다. 이 함수를 호출하면 스크립팅 엔진은 PHP가 오류로 인해 실패하기 전에 필요한 클래스를 로드할 수 있는 마지막 기회를 갖게 됩니다.
간단한 가져오기 예:
먼저 새 클래스 파일 MyClass.class.php를 만듭니다.
<?php class MyClass { public function __construct() { echo "This is MyClass's construct"; } }
같은 디렉토리에 원하는 이름으로 새 PHP 파일을 만듭니다.
<?php function __autoload($cls){ var_dump($cls); require './'.$cls.".class.php"; } $o1 = new MyClass(); // 这里不会再执行__autoload了,因为这个类已经require进来了。只有在当前文件中找不到该类的时候才会调用__autoload函数 $o2 = new MyClass();
여기서 필수 콘텐츠는 __autoload()에 배치됩니다. 이 함수가 정의되지 않으면 MyClass 클래스를 찾을 수 없음을 나타내는 치명적인 오류(Fatal)가 보고됩니다.
이 매직 메소드를 정의하면 새 객체가 발견되고 현재 코드에서 클래스 정의를 찾을 수 없는 경우(위의 두 조건이 충족됨) __autoload() 함수가 클래스 매개변수를 지정하고 함수 코드 세그먼트를 실행합니다.
따라서 var_dump("MyClass"); 및 require './MyClass.class.php';
가 함수에서 실행됩니다.
결과는 다음과 같습니다.
string(7) "MyClass" This is MyClass's constructThis is MyClass's construct
여기에는 var_dump의 내용이 1회, 생성자 echo의 내용이 2회 출력됩니다. require가 들어오고 new MyClass가 다시 생성되면 __autoload() 함수가 다시 호출되지 않는다는 것을 증명할 수 있습니다.
자동 로드에는 단점이 있습니다. 반복적으로 정의할 수 없기 때문에(PHP 언어의 특성) 팀 개발을 수행할 경우 불편하고 충돌이 발생하기 쉽습니다.
PHP 5.1.2 이후에는 자동 로드 등록 함수 spl_autoload_register가 있습니다. 다음은 이 함수에 대한 몇 가지 지침입니다.
SPL __autoload 함수 대기열에 함수를 등록합니다. 아직 활성화되지 않은 경우 이 대기열의 기능을 활성화하십시오.
여러 자동 로드 기능이 필요한 경우 spl_autoload_register()가 이러한 요구 사항을 충족합니다. 실제로 자동 로드 기능의 대기열을 생성하고 정의된 순서대로 하나씩 실행합니다. 반면 __autoload()는 한 번만 정의할 수 있습니다.
PHP 5.3에 네임스페이스가 도입된 이후 이 함수의 매개변수는 다양한 형태를 갖게 되었습니다.
spl_autoload_register('my_autoloader'); // my_autoloader是一个函数名 spl_autoload_register(array('Loader', 'loadClass')); // 表示类内的静态方法,Loader::loadClass // 或者,自 PHP 5.3.0 起可以使用一个匿名函数 spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php'; }); spl_autoload_register(__NAMESPACE__ .'\Foo::test'); // 自 PHP 5.3.0 起,可以使用命名空间的形式
이 함수는 새 객체 이전에만 호출하면 됩니다.
다음은 예시입니다(위의 4가지 형식 테스트).
<?php // namespace Atl; // 加了这句话报错了! function my_autoloader($cls){ echo "<br/>$cls - my_autoloader <br/>"; require_once './MyClass1.class.php'; } class Loader{ public static function loadClass($cls){ echo "<br/>$cls - Loader::loadClass <br/>"; require_once './MyClass2.class.php'; } public static function nspClass($cls){ echo "<br/>$cls - Loader::nspClass <br/>"; require_once './MyClass3.class.php'; } } spl_autoload_register('my_autoloader'); $o1 = new MyClass1(); spl_autoload_register(array('Loader', 'loadClass')); $o2 = new MyClass2(); // 版本检测 if(version_compare(PHP_VERSION, '5.3.0', '<')) die("以下的两个测试需要PHP 5.3及以上"); spl_autoload_register(__NAMESPACE__ .'\Loader::nspClass'); $o3 = new MyClass3(); spl_autoload_register(function ($cls) { echo "<br/>$cls - anonymous function <br/>"; require_once './MyClass4.class.php'; }); $o4 = new MyClass4();
출력된 결과는 다음과 같습니다. (검색 순서는 등록 순서와 동일하니 참고하세요)
MyClass1 - my_autoloader This is MyClass1's construct MyClass2 - my_autoloader MyClass2 - Loader::loadClass This is MyClass2's construct MyClass3 - my_autoloader MyClass3 - Loader::loadClass MyClass3 - Loader::nspClass This is MyClass3's construct MyClass4 - my_autoloader MyClass4 - Loader::loadClass MyClass4 - Loader::nspClass MyClass4 - anonymous function This is MyClass4's construct