클래스 자동로딩

많은 개발자들이 객체지향 어플리케이션을 만들때 클래스 하나당 하나의 php 소스파일을 만들어 클래스를 정의합니다. 스크립트마다 매번 이렇게 많은 클래스를 include 하는것은 꽤 성가신 일입니다.

spl_autoload_register() 함수는 임의의 수의 자동 로더를 등록하여 현재 정의되지 않은 클래스와 인터페이스가 자동으로 로드되도록 합니다. 자동 로더를 등록함으로써 PHP는 오류로 인해 실패하기 전에 클래스나 인터페이스를 로드할 수 있는 마지막 기회를 얻게 됩니다.

주의 PHP 8.0.0 이전에는 __autoload()를 사용하여 클래스와 인터페이스를 자동 로드할 수 있었습니다. 그러나 spl_autoload_register()에 대한 덜 유연한 대안이며 __autoload()는 PHP 7.2.0에서 더 이상 사용되지 않으며 PHP 8.0.0에서 제거되었습니다.

예제 #1 자동 로드 예

이 예제는 MyClass1.php 및 MyClass2.php 파일에서 각각 MyClass1 및 MyClass2 클래스를 로드하려고 시도합니다.

                  
<?php
spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});

$obj  = new MyClass1();
$obj2 = new MyClass2();
?>
                  
                

예제 #2 다른 예제 자동 로드

이 예에서는 인터페이스 ITest를 로드하려고 시도합니다.

                  
<?php

spl_autoload_register(function ($name) {
    var_dump($name);
});

class Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>
                  
                

예제 #3 예외 처리가 있는 자동 로드

이 예제는 예외를 발생시키고 try/catch 블록을 보여줍니다.

                  
<?php
spl_autoload_register(function ($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";
}
?>
                  
                

위의 예는 다음을 출력합니다.

Want to load NonLoadableClass.
Unable to load NonLoadableClass.
                

예제 #4 예외 처리를 통한 자동 로드 - 사용자 정의 예외 누락

이 예에서는 로드할 수 없는 사용자 지정 예외에 대한 예외를 throw합니다.

                  
<?php
spl_autoload_register(function ($name) {
    echo "Want to load $name.\n";
    throw new MissingException("Unable to load $name.");
});

try {
    $obj = new NonLoadableClass();
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}
?>
                  
                

위의 예는 다음을 출력합니다.

Want to load NonLoadableClass.
Want to load MissingException.

Fatal error: Class 'MissingException' not found in testMissingException.php on line 4
                

기타