PHP OOP에서 사용자 정의 클래스 자동 로드 함수 만들기
기본 자동 로드 기능이 어떤 이유로든 마음에 들지 않을 수 있습니다. 이 경우 사용자 정의 자동 로드를 작성할 수 있습니다.
이를 위해 spl_autoload_register 함수에
첫 번째 매개변수로 작성한 콜백 함수를 전달해야 합니다.
이 함수는 PHP가 로드되지 않은 클래스에 대한 접근을 감지할 때 호출됩니다.
이 함수의 매개변수에는 네임스페이스를 포함한 클래스 이름이 전달됩니다:
<?php
spl_autoload_register(function($class) {
// $class 변수에는 네임스페이스를 포함한 클래스 이름이 들어갑니다.
});
?>
그리고 이 함수의 책임은 클래스 이름을 기준으로
require를 통해 해당 클래스를 로드하는 것입니다.
즉, 이 함수 내에서 클래스 로드를 위한 자체 규칙, 즉
자체 명명 규약을 작성해야 합니다.
사용자 정의 자동 로드의 예를 작성해 보겠습니다. 예를 들어, 클래스 파일의 경로가 사이트 루트부터 네임스페이스와 동일하되 대소문자를 유지한다고 가정해 봅시다.
즉, Core\Admin\PageController 클래스가 있다면,
해당 경로는 Core/Admin/PageController.php가 되어야 합니다.
보시다시피, 네임스페이스를 포함한 클래스 이름을 변환하려면
백슬래시를 슬래시로 변경하고 클래스 이름에
.php를 추가하기만 하면 됩니다. 이를 구현해 보겠습니다:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
그러나 파일에 대한 상대 경로(사이트 루트 기준)가 생성됩니다. 절대 경로로 만드는 것이 더 좋습니다. 다음과 같이 하세요:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
또 다른 미묘한 차이가 있습니다. 다양한 운영 체제에서
폴더 경로는 슬래시 또는 백슬래시로 구분될 수 있습니다.
운영 체제에 독립적인 코드를 만들어 보겠습니다.
이를 위해 경로 구분자로 슬래시 대신
현재 스크립트가 실행 중인 운영 체제의 올바른 구분자를 포함하는
상수 DIRECTORY_SEPARATOR를 사용하겠습니다.
결과적으로 다음 코드를 얻습니다:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
제가 만든 자동 로드 함수를 테스트해 보세요.
자신만의 자동 로드 규칙을 생각해 내고 구현해 보세요.