클래스 자동로딩
많은 개발자들이 객체지향 어플리케이션을 만들때 클래스 하나당 하나의 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