PHP / Autoloading үндэс

Autoloading үндэс

Төсөл томрох тусам арав, хорин класс файл байх нь хэвийн. Тэдгээрийг бүгдийг require_once -ээр нэг нэгээр оруулах бол уйтгартай бөгөөд алдаа гаргахад хялбар. Autoloading нь PHP-д класс хэрэглэгдэх мөчид тухайн файлыг автоматаар олж ачааллах механизм юм — нэг ч require бичихгүйгээр.

Autoloading яагаад хэрэгтэй вэ?

Autoloading-гүй бол файл бүрийг гараар оруулах ёстой:

php
<?php
// ❌ Autoloading-гүй — маш уйтгартай
require_once 'src/Models/User.php';
require_once 'src/Models/Post.php';
require_once 'src/Controllers/UserController.php';
require_once 'src/Controllers/PostController.php';
require_once 'src/Services/MailService.php';
require_once 'src/Services/AuthService.php';
// ... мянга мянган файл байвал яах вэ?

// ✓ Autoloading-тай — autoloader нэг удаа тохируулаад дуусна
// Дараа нь зүгээр л ашиглана:
$хэрэглэгч = new User();
$пост = new Post();
// PHP өөрөө файлуудыг олж ачааллана
?>

spl_autoload_register — суурь autoloader

PHP-ийн суурилуулсан spl_autoload_register() функц нь "класс олдохгүй бол энэ функцийг дуудаарай" гэж PHP-д зааж өгдөг:

php
<?php
// autoload.php
spl_autoload_register(function (string $класс_нэр): void {
    // App\Models\User → src/Models/User.php болгон хөрвүүлнэ
    $зам = str_replace('\\', DIRECTORY_SEPARATOR, $класс_нэр);
    $файл = __DIR__ . '/src/' . $зам . '.php';

    if (file_exists($файл)) {
        require_once $файл;
    }
});

// Ашиглах
// PHP "App\Models\User" классыг хайхад autoloader-ийг дуудна
// Autoloader src/Models/User.php файлыг ачааллана
$хэрэглэгч = new App\Models\User();
?>

Файлын бүтэц нь namespace-тэй таарах ёстой:

код
төсөл/
├── autoload.php
└── src/
    ├── Models/
    │   ├── User.php          ← namespace App\Models;
    │   └── Post.php          ← namespace App\Models;
    └── Controllers/
        └── UserController.php ← namespace App\Controllers;

PSR-4 стандарт

PHP-ийн хамтын нийгэмлэг PSR-4 нэртэй autoloading стандарт тогтоосон. Composer энэ стандартыг дагадаг тул аль ч PHP төсөлд нэг загвараар ажилладаг:

код
Namespace угтвар    →  Үндэс директор
---------------------------------
App\                →  src/
App\Models\User     →  src/Models/User.php
App\Http\Request    →  src/Http/Request.php
App\Services\Mail   →  src/Services/Mail.php

composer.json-д PSR-4 autoloading тохируулах:

json
{
    "name": "миний/төсөл",
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "require": {}
}

Тохируулсны дараа:

bash
composer dump-autoload

Дараа нь vendor/autoload.php нэг л удаа оруулна — дуусгавар:

php
<?php
// index.php
require_once __DIR__ . '/vendor/autoload.php';

// Одоо бүх класс автоматаар ачааллагдана
$хэрэглэгч  = new App\Models\User();
$захидал    = new App\Services\MailService();
$controller = new App\Controllers\UserController();
?>

Класс файлын зөв бүтэц

PSR-4-ийг дагасан класс файл иймэрхүү харагдана:

php
<?php
// src/Models/User.php

namespace App\Models;

use App\Services\MailService;

class User
{
    private string $нэр;
    private string $имэйл;

    public function __construct(string $нэр, string $имэйл)
    {
        $this->нэр    = $нэр;
        $this->имэйл = $имэйл;
    }

    public function нэр_авах(): string
    {
        return $this->нэр;
    }

    public function тавтай_морил(): string
    {
        return "Сайн уу, {$this->нэр}!";
    }
}
php
<?php
// src/Controllers/UserController.php

namespace App\Controllers;

use App\Models\User;

class UserController
{
    public function харуулах(int $id): void
    {
        // Autoloader User классыг автоматаар ачааллана
        $хэрэглэгч = new User("Батбаяр", "bat@example.mn");
        echo $хэрэглэгч->тавтай_морил();
    }
}
?>

composer dump-autoload ба оптимизаци

Хөгжүүлэлт ба production орчинд ялгаатай тохиргоо хэрэглэнэ:

bash
# Хөгжүүлэлтэд — ердийн
composer dump-autoload

# Production-д — оптимизаци хийсэн (илүү хурдан)
composer dump-autoload --optimize

# Бүх классыг нэг файлд нэгтгэнэ — хамгийн хурдан
composer dump-autoload --classmap-authoritative

Autoloading нь vendor/composer/ директорт хадгалагддаг — энэ файлуудыг гараар өөрчлөх шаардлагагүй. composer dump-autoload тушаал өгөхөд автоматаар шинэчлэгдэнэ.

Дараагийн хичээлд:

XSS (Cross-Site Scripting) халдлагаас хэрхэн хамгаалах тухай судална. Хэрэглэгчийн оролтыг HTML-д хэвлэхдээ яагаад htmlspecialchars() заавал хэрэглэх ёстой, Content Security Policy гэж юу болохыг үзнэ.