PSR-4 오토로딩 표준
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 12번째.
PSR-4는 네임스페이스와 파일 위치를 기반으로 PHP 클래스를 자동으로 로드하는 방법을 정의하는 표준입니다. 각 클래스 파일을 수동으로 포함하는 대신, PSR-4를 사용하면 클래스를 사용할 때 PHP가 자동으로 클래스를 찾아 로드할 수 있습니다.
핵심 규칙은 간단합니다: 네임스페이스는 디렉토리 구조와 일치해야 합니다. App\Models\User 클래스가 있다면, 파일은 App/Models/User.php에 위치해야 합니다.
<?php
// 파일: src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
PSR-4 규칙을 따르는 간단한 오토로더(autoloader) 함수를 작성할 수 있습니다:
<?php
// 파일: autoload.php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// 클래스가 네임스페이스 접두사를 사용하는지 확인
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, width: strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
spl_autoload_register 함수는 알 수 없는 클래스를 만날 때마다 PHP가 사용자의 함수를 호출하도록 지시합니다. 이 함수는 네임스페이스를 파일 경로로 변환하고 이를 로드합니다.
핵심 포인트: PSR-4는 네임스페이스와 파일 경로 사이에 예측 가능한 매핑을 생성합니다. App\Models\User를 보면, 해당 파일이 src/Models/User.php에 있다는 것을 즉시 알 수 있습니다. 이 관례는 프로젝트를 탐색하고 유지 관리하기 쉽게 만들어 줍니다.
챌린지
쉬움네임스페이스와 파일 위치를 기반으로 클래스를 자동으로 로드하는 간단한 PSR-4 오토로딩 시스템을 구축해 보겠습니다.
PSR-4가 네임스페이스를 디렉토리 경로에 어떻게 매핑하는지 보여주는 세 개의 파일로 프로젝트를 생성하게 됩니다:
src/Services/Logger.php—App\Services네임스페이스에Logger클래스를 정의합니다. 이 클래스는public $name속성, 이름을 받아 설정하는 생성자, 그리고"[name] logged: [message]"를 반환하는log($message)메서드를 가져야 합니다.src/Services/Mailer.php—App\Services네임스페이스에Mailer클래스를 정의합니다. 이 클래스는public $sender속성, 발신자(sender)를 받아 설정하는 생성자, 그리고"Mail from [sender] to [to]"를 반환하는send($to)메서드를 가져야 합니다.main.php—App\네임스페이스 접두사를src/디렉토리에 매핑하는spl_autoload_register를 사용하여 PSR-4 오토로더를 만듭니다. 오토로더는 네임스페이스 구분자를 디렉토리 구분자로 변환하고.php를 추가하여 올바른 파일을 찾아야 합니다. 오토로더를 등록한 후,use키워드를 사용하여 두 클래스를 모두 가져온 다음, 이름이"FileLogger"인Logger와 발신자가"admin@site.com"인Mailer를 생성합니다. 로거에서log("System started")를 호출한 결과와 메일러에서send("user@example.com")를 호출한 결과를 각각 한 줄씩 출력합니다.
핵심은 오토로더 함수가 정규화된 클래스 이름(예: App\Services\Logger)을 전달받아 이를 파일 경로(src/Services/Logger.php)로 변환해야 한다는 점입니다. strpos를 사용하여 클래스가 네임스페이스 접두사로 시작하는지 확인하고, substr을 사용하여 상대적인 클래스 이름을 가져오며, str_replace를 사용하여 백슬래시를 슬래시로 변환하세요.
치트 시트
PSR-4는 PHP 클래스가 네임스페이스와 파일 위치에 따라 어떻게 자동으로 로드되어야 하는지를 정의하는 표준입니다. 네임스페이스는 반드시 디렉토리 구조와 일치해야 합니다.
클래스 구조 예시:
<?php
// File: src/Models/User.php
namespace App\Models;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
spl_autoload_register를 사용한 PSR-4 오토로더:
<?php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$baseDir = __DIR__ . '/src/';
// 클래스가 우리의 네임스페이스 접두사를 사용하는지 확인합니다.
if (strpos($class, $prefix) === 0) {
$relativeClass = substr($class, strlen($prefix));
$file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php';
if (file_exists($file)) {
require $file;
}
}
});
오토로더는 올바른 파일을 찾기 위해 네임스페이스 구분자(\)를 디렉토리 구분자(/)로 변환하고 .php를 추가합니다. 예를 들어, App\Models\User는 src/Models/User.php로 매핑됩니다.
직접 해보기
<?php
// PSR-4 오토로더 구현
// TODO: spl_autoload_register를 사용하여 오토로더 등록
// 오토로더의 역할:
// 1. 클래스가 'App\' 네임스페이스 접두사로 시작하는지 확인
// 2. 'App\' 접두사를 제거하여 상대 클래스 이름을 가져옴
// 3. 네임스페이스 구분 기호(\)를 디렉토리 구분 기호(/)로 변환
// 4. 앞에 'src/'를 붙이고 뒤에 '.php'를 추가하여 파일 경로 생성
// 5. 파일이 존재하면 해당 파일을 require 함
spl_autoload_register(function ($class) {
// TODO: 네임스페이스 접두사와 기본 디렉토리 정의
// TODO: 클래스가 네임스페이스 접두사를 사용하는지 확인 (strpos 사용)
// TODO: 상대 클래스 이름 가져오기 (substr 사용)
// TODO: \를 /로 교체하여 파일 경로 생성 (str_replace 사용)
// TODO: 파일이 존재하면 해당 파일을 require 함
});
// TODO: 'use' 키워드를 사용하여 Logger 및 Mailer 클래스 임포트
// TODO: 이름이 "FileLogger"인 Logger 인스턴스 생성
// TODO: 발신자가 "admin@site.com"인 Mailer 인스턴스 생성
// TODO: log("System started")의 결과 출력
// TODO: send("user@example.com")의 결과 출력
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션