PHP에서 클래스를 사용할 때 가장 기본은 include나 require로 직접 파일을 불러오는 방법입니다. 하지만 프로젝트가 커지면 클래스 파일이 많아지고, 매번 일일이 include/require 하기 번거로워집니다. 이 문제를 해결하기 위해 자동 로딩(autoloading) 기능이 제공됩니다.
spl_autoload_register()는 클래스를 호출했을 때 자동으로 해당 클래스를 불러올 수 있는 함수를 등록하는 기능입니다.
<?php
spl_autoload_register(function ($className) {
require_once $className . ".php";
});
$car = new Car(); // Car.php 파일 자동 로딩
위 예시는 Car라는 클래스를 호출하면, PHP가 자동으로 Car.php 파일을 불러오도록 설정한 것입니다.
실제 프로젝트에서는 Composer의 PSR-4 Autoloading 규칙을 사용하는 것이 일반적입니다.
예:
composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
구조:
src/
Car.php → namespace App;
<?php
require 'vendor/autoload.php';
use App\Car;
$car = new Car();
이제 클래스 파일을 일일이 include할 필요 없이, Composer autoload가 알아서 관리해 줍니다.
네임스페이스는 클래스 이름 충돌을 방지하고 코드를 논리적으로 구분하는 방법입니다.
<?php
namespace MyApp\Models;
class User {
public function __construct() {
echo "User 모델 생성됨";
}
}
다른 파일에서 사용:
<?php
require "User.php";
// 방법 1: 풀 네임스페이스 사용
$user = new \MyApp\Models\User();
// 방법 2: use 키워드 사용
use MyApp\Models\User;
$user = new User();
만약 Library\User 과 MyApp\Models\User 클래스가 둘 다 있다면?
use Library\User as LibUser;
use MyApp\Models\User as AppUser;
$u1 = new LibUser();
$u2 = new AppUser();
as 키워드로 별칭(Alias)을 지정해서 충돌을 피할 수 있습니다.
실전에서는 네임스페이스와 자동 로딩을 함께 씁니다.
예:
src/
Models/
User.php
src/Models/User.php
<?php
namespace App\Models;
class User {
public function hello() {
return "안녕하세요, User 클래스입니다.";
}
}
메인 코드:
<?php
require "vendor/autoload.php";
use App\Models\User;
$user = new User();
echo $user->hello();
클래스 로딩
작은 프로젝트: include, require, spl_autoload_register()
큰 프로젝트: Composer + PSR-4 Autoloading 사용
네임스페이스
클래스 이름 충돌 방지
namespace, use, as 키워드 활용
계층 구조로 정리 가능 (예: App\Models\User)