클래스 오토로딩
클래스 오토로딩 (Autoloading Classes)
객체 지향 애플리케이션을 작성하는 개발자들은 대부분 클래스 정의 하나마다 PHP 소스 파일 하나를 만들고는 해요. 그런데 이렇게 하다 보면 매 스크립트의 시작 부분에 필요한 include 목록을 길게 나열해야 하는 게 (클래스마다 한 줄씩) 큰 골칫거리가 되죠.
spl_autoload_register() 함수는 오토로더(autoloader)를 몇 개든 등록할 수 있게 해 줘요. 이러면 클래스나 인터페이스가 아직 정의돼 있지 않을 때 자동으로 로드할 수 있어요. 오토로더를 등록해 두면, PHP는 오류를 내며 실패하기 전에 클래스나 인터페이스를 로드할 마지막 기회를 한 번 더 갖게 되는 거예요.
클래스처럼 취급되는 구성 요소는 뭐든 같은 방식으로 오토로드할 수 있어요. 클래스, 인터페이스, 트레이트(trait), 열거형(enum)이 모두 여기에 해당해요.
주의
PHP 8.0.0 이전에는
__autoload()함수로 클래스와 인터페이스를 오토로드할 수 있었어요. 다만 이 방식은spl_autoload_register()에 비해 유연성이 떨어지는 대안이었고,__autoload()는 PHP 7.2.0부터 deprecated 되었으며 PHP 8.0.0에서 제거됐어요.
참고
오토로더를 여러 개 등록하고 싶다면
spl_autoload_register()를 여러 번 호출하면 돼요. 다만 오토로드 함수 안에서 예외를 던지면 그 과정이 중단되고 뒤따르는 다른 오토로드 함수들이 실행되지 않아요. 그래서 오토로드 함수 안에서 예외를 던지는 것은 강하게 권장되지 않아요.
예제 #1 오토로드 예제
이 예제는 MyClass1 클래스와 MyClass2 클래스를 각각 MyClass1.php, MyClass2.php 파일에서 로드하려고 시도해요.
<?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 Composer의 오토로더 사용하기
Composer는 관리 중인 패키지를 자동으로 로드하도록 설정된 vendor/autoload.php 파일을 생성해요. 이 파일을 include 하면 추가 작업 없이 그 패키지들을 사용할 수 있어요.
<?php
require __DIR__ . '/vendor/autoload.php';
$uuid = Ramsey\Uuid\Uuid::uuid7();
echo "Generated new UUID -> ", $uuid->toString(), "\n";
?>
참고 (See Also)
unserialize()unserialize_callback_funcunserialize_max_depthspl_autoload_register()spl_autoload()__autoload()