update : 2015.11.03
php.shukuma.com

검색:
 
 
클래스 자동로딩

클래스 자동로딩

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

php 5 에서는 더 이상 그렇게 하지 않아도 됩니다. __autoload() 함수를 정의하면 사용하려는 클래스나 인터페이스가 아직 정의되지 않았을 경우 자동으로 호출됩니다. 이 함수는 PHP가 오류로 실패하기 이전에 적절한 class가 로드 될수 있도록 마지막 기회를 제공합니다.

Tip

spl_autoload_register() 는 클래스 자동로딩에 대한 더욱 유연한 기능을 제공합니다. 이러한 이유로 __autoload() 가 미래에는 완전히 제거되거나, 사용을 지양하게 될지도 모릅니다.

Note:

5.3.0 이전에서는 __autoload 함수 내부에서 발생한 exception은 catch 블럭으로 catch되지 않고, fatal 에러를 야기했습니다. 5.3.0 이상부터는 catch 블럭으로 catch할 수 있게 되었습니다. 하지만 한가지 조건이 있습니다. 사용자정의 exception을 발생시킬때 사용자정의 exception class가 이미 존재해야 합니다. __autoload 함수를 재귀적으로 사용해서 사용자정의 exception class를 로드 시키는것도 한가지 방법이 될수 있습니다.

Note:

CLI에서는 자동로딩을 지원하지 않습니다. interactive mode.

Note:

클래스명을 call_user_func() 에서 사용하는 경우, ../과 같은 위험한 문자가 포함되어 있을 수가 있습니다. 사용자가 입력한 값을 그대로 사용하지 않을것을 권장하며, 아니면 최소한 __autoload() 에서 입력값을 검증해줘야 합니다.

Example #1 자동로딩 예제

이 예제는 MyClass1MyClass2를 각각 MyClass1.phpMyClass2.php로부터 로드를 시도합니다.

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

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

Example #2 다른 자동로딩 예제

이 예제는 ITest 인터페이스의 로드를 시도합니다.

<?php

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

class 
Foo implements ITest {
}

/*
string(5) "ITest"

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

Example #3 5.3.0 이후의 자동로딩 예외 핸들링

이 예제는 예외를 발생하고, tray/catch 블럭을 사용하는 모습을 보여줍니다.

<?php
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";
}
?>

위 예제의 출력:

Want to load NonLoadableClass.
Unable to load NonLoadableClass.

Example #4 5.3.0 이후의 자동로딩 예외 핸들링 - 사용자정의 exception 을 찾을수 없음

이 예제는 로딩할 수 없는 사용자정의 exception 에 대한 경우를 보여줍니다.

<?php
function __autoload($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