Autoloading үндэс
Төсөл томрох тусам арав, хорин класс файл байх нь хэвийн. Тэдгээрийг бүгдийг require_once -ээр нэг нэгээр оруулах бол уйтгартай бөгөөд алдаа гаргахад хялбар. Autoloading нь PHP-д класс хэрэглэгдэх мөчид тухайн файлыг автоматаар олж ачааллах механизм юм — нэг ч require бичихгүйгээр.
Autoloading яагаад хэрэгтэй вэ?
Autoloading-гүй бол файл бүрийг гараар оруулах ёстой:
<?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
// 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 тохируулах:
{
"name": "миний/төсөл",
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"require": {}
}
Тохируулсны дараа:
composer dump-autoload
Дараа нь vendor/autoload.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
// 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
// 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 орчинд ялгаатай тохиргоо хэрэглэнэ:
# Хөгжүүлэлтэд — ердийн
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 гэж юу болохыг үзнэ.