7.05. 오토로드 사용하기
오토로드는 클래스가 호출될 때 자동으로 특정 파일을 불러오고 실행하는 PHP 특유의 기능이다.
오토로드가 필요한 이유는 PHP는 다른 언어와 달리 "진입점"이라는 개념이 존재하지 않기 때문이다. PHP는 전통적으로 웹서버에 의해 물리적인 위치에 있는 파일이 직접 호출되어 실행되는 형태였다. 즉, 어플리케이션의 진입점이 각 파일마다 있었던 것이다.
이러한 특성은 이해 및 구현이 쉽다는 장점이 있었으나, 반대로 디렉토리의 관리에 어려움을 겪는 일도 다반사였다. 다른 언어는 명시적인 진입점이 있으므로 진입점을 기준으로 다른 파일들을 참조하면 되는데, PHP는 이게 불가능하므로 현재 파일을 기준으로 다른 파일을 불러오거나 DOCUMENT_ROOT를 기준으로 불러오는 방법밖에 없었다.
게다가 참조하는 모든 파일들을 명시적으로 포함시켜야 하므로, 포함시키는 코드가 길어짐은 물론 실수로 빠뜨리는 일도 많았다.
이러한 불편함을 해소하고자 자동으로 파일을 불러오는 오토로드 기능이 PHP 5.1.0 버전부터 도입되었다. 활성화된 것은 PHP 7 이상에서다.
<?php
namespace yse;
class Sample
{
// member variable
private $name;
private $age;
// constructor
public function __construct()
{
$this->name = "yse";
$this->age = "10";
}
// method
public function tell()
{
echo "my name is {$this->name} .";
echo " and my age is {$this->age} .";
}
// method. return $this
public function add_age($age)
{
$this->age += $age;
return $this;
}
// static method
public static function factory()
{
return new Sample();
}
}
위 코드는 yse/Sample.php 위치에 저장한다.
spl_autoload_register(function ($class) {
include "$class.php";
});
use yse\Sample;
$sample = Sample::factory();
$sample->tell();
echo "<br />";
$sample = new yse\Sample();
$sample->add_age(5)->tell();
위 코드는 al.php로 저장한다. 브라우저에서 http://localhost/al.php 로 확인한다.
my name is yse . and my age is 10 .
my name is yse . and my age is 15 .
오토로드는 클래스가 호출될 때 자동으로 특정 기능을 실행시키는 것이다. 대부분의 경우에는 필요한 파일을 일일이 require 하지 않고 자동으로 불러오고 싶을 때 사용한다.
반드시 클래스에만 작동하므로 함수나 변수에서는 동작하지 않는다.
spl_autoload_register 는 클래스가 호출되고 나서 생성되기 전에 실행할 함수를 정의하는 내장 함수다. PHP 내부의 동작을 가로채는 메타 함수 중 하나이다.
spl_autoload_register(function ($class) {
include "$class.php";
});
예제 코드에서 Sample::factory() 코드가 호출되면 먼저 spl_autoload_register 함수의 파라미터인 익명함수 본문 include "$class.php; 가 실행된다. 이후 php 엔진은 Sample 클래스의 정적 함수 factory()를 실행시킨다.
클래스가 동작하기 전에 오토로드로 인해 include 가 동작하기 때문에 명시적인 include 구문이 없이도 자동으로 파일을 불러오게 된다.
오토로드를 사용하기 위해서는 클래스의 네임스페이스와 클래스명을 구성하는 규칙과 파일 경로 규칙이 서로 맞아야 한다. 오토로드는 결국 네임스페이스와 클래스명으로 파일의 위치를 찾아가는 것이기 때문이다.
또한 포함되는 파일은 반드시 namespace 를 선언해야 한다. 그렇지 않으면 포함되는 파일 내의 클래스가 전역 클래스 공간에 등록되므로 네임스페이스 안에서 찾을 수 없게 된다.