이전에 우리는 PHP에서 클래스의 자동 로딩 기능을 실제로 활용하는 Composer 자동 로딩의 원리를 배웠습니다.
PHP에서 클래스 자동 로드는 주로 __autoload() 및 spl_autoload_register()라는 두 가지 메서드에 의존합니다.
오늘은 이 두 가지 방법의 사용법을 간략하게 살펴보겠습니다.
__autoload()
곧 사라질 마법의 메소드로서, 우리는 그것을 이해하면 됩니다. PHP7에서 이 메서드를 사용하면 오래된 경고가 보고되고 시스템에서는 spl_autoload_register() 메서드를 사용하도록 권장합니다.
function __autoload($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; } $autoA = new AutoA(); var_dump($autoA);
AutoA 클래스를 인스턴스화하면 현재 파일에는 이 클래스가 없으며 다른 파일을 포함하거나 요구하지 않습니다. 이때 자동으로 매직 메서드 __autoload()가 입력됩니다. __autoload() 메서드에서는 이 클래스가 있는 파일만 포함하면 됩니다.
spl_autoload_register()
이 메서드는 현재 위의 매직 메서드로 클래스를 자동으로 로드하는 기능을 대체했습니다. spl 확장 라이브러리의 메소드입니다. 이제 spl 확장 라이브러리가 기본적으로 PHP에 통합되어 안심하고 직접 사용할 수 있습니다.
__autoload()에 비해 spl_autoload_register()의 장점은 __autoload()를 등록하고 __autoload() 대기열을 구현 및 유지 관리할 수 있다는 것입니다. 원래는 파일에 하나의 __autoload() 메서드만 있을 수 있었지만 지금은 대기열만 있습니다.
이렇게 하면 하나의 __autoload() 메서드에 모든 로딩 코드를 작성할 필요가 없지만 여러 spl_autoload_register()를 사용하여 각 클래스를 개별적으로 로드할 수 있습니다.
spl_autoload_register(function($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; }); $autoA = new AutoA(); var_dump($autoA);
참고: Composer 원리 심층 연구(2)
include 또는 include_once 사용
자동 로딩에서는 include만 사용하면 되며 클래스가 반복적으로 로딩되지 않습니다.
spl_autoload_register(function($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; echo $name, PHP_EOL; }); $autoA = new AutoA(); var_dump($autoA); $autoA = new AutoA(); var_dump($autoA); $autoA = new AutoA(); var_dump($autoA); $autoB = new AutoB(); var_dump($autoB);
코드를 보면 클래스가 여러 번 인스턴스화될 때 $name이 한 번만 출력되는 것을 볼 수 있습니다. 따라서 클래스 파일을 반복적으로 로드하는 문제에 대해 걱정할 필요가 없습니다. 게다가 대규모 프레임워크에서 Composer를 사용하는 경우 많은 클래스가 로드되며, _once 메서드도 효율성 문제를 야기합니다.