많은 개발자가 객체 지향 애플리케이션을 작성할 때 각 클래스 정의에 대한 PHP 소스 파일을 만듭니다. 각 스크립트의 시작 부분에 포함 파일의 긴 목록(클래스당 하나의 파일)을 작성해야 한다는 점은 큰 성가신 일입니다.
PHP 5에서는 더 이상 필요하지 않습니다. 아직 정의되지 않은 클래스를 사용하려고 할 때 자동으로 호출되는 __autoload() 함수를 정의할 수 있습니다. 이 함수를 호출하면 스크립팅 엔진은 PHP가 오류로 인해 실패하기 전에 필요한 클래스를 로드할 수 있는 마지막 기회를 갖게 됩니다.
팁
spl_autoload_register()는 클래스 자동 로드를 구현하는 보다 유연한 방법을 제공합니다. 따라서 __autoload() 함수의 사용은 더 이상 권장되지 않으며 향후 버전에서는 더 이상 사용되지 않을 수 있습니다.
참고:
버전 5.3.0 이전에는 __autoload 함수에서 발생하는 예외를 catch 문 블록에서 포착할 수 없으며 치명적인 오류가 발생합니다. 5.3.0 이상부터 __autoload 함수에 의해 발생한 예외는 catch 문 블록에 의해 포착될 수 있지만 조건을 따라야 합니다. 사용자 정의 예외가 발생하는 경우 해당 사용자 정의 예외 클래스가 있어야 합니다. __autoload 함수는 사용자 정의 예외 클래스를 재귀적으로 자동으로 로드할 수 있습니다.
참고:
PHP의 CLI 대화형 모드에서는 자동 로딩을 사용할 수 없습니다.
예제 #1 자동 로드 예
이 예는 각각 MyClass1.php 및 MyClass2.php 파일에서 MyClass1 및 MyClass2를 로드하려고 시도합니다.
function __autoload($class_name){ require_once $class_name.'.php'; } $obj = new MyClass1(); $obj2 = new MyClass2();
참고: MyClass1 .php 및 MyClass2.php는
예제 #2에 로드하려면 현재 스크립트와 동일한 디렉토리에 있어야 합니다.
이 예는 ITest 인터페이스를 로드하려고 시도합니다.
function __autoload($name) { var_dump($name); } class Foo implements ITest { } /* string(5) "ITest" Fatal error: Interface 'ITest' not found in ... */
예제 #3 PHP 5.3.0+에서 자동 로딩 예외 처리
이 예는 예외를 발생시키고 try/catch 문 블록에서 이를 보여줍니다.
function __autoload($name) { echo "Want to load $name.\n"; throw new Exception("Unable to load $name."); } try { $obj = new NonLoadableClass(); } catch (Exception $e) { echo $e->getMessage(), "\n"; }
위 루틴은 다음을 출력합니다.
NonLoadableClass를 로드하고 싶습니다.
NonLoadableClass를 로드할 수 없습니다.
예 #4 PHP 5.3.0에서 자동 로딩 + 예외 처리 - 사용자 정의 예외 메커니즘 없음
이 예는 존재하지 않는 사용자 정의 예외 처리 기능에 예외를 발생시킵니다.
위 루틴은 다음을 출력합니다.
NonLoadableClass를 로드하고 싶습니다.
MissingException을 로드하고 싶습니다.
치명적인 오류: testMissingException.php에서 'MissingException' 클래스를 찾을 수 없습니다. 4번째 줄