클래스 오토로딩

클래스 오토로딩 (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_func
  • unserialize_max_depth
  • spl_autoload_register()
  • spl_autoload()
  • __autoload()