კლასების ავტომატური ჩატვირთვის საკუთარი ფუნქცია OOP-ში PHP-ში
ხშირად, ჩვეულებრივი ავტომატური ჩატვირთვა შეიძლება არ მოგწონდეთ რაიმე მიზეზის გამო. ასეთ შემთხვევაში, შეგიძლიათ დაწეროთ საკუთარი ავტომატური ჩატვირთვის სისტემა.
ამისთვის, ფუნქციაში 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);
});
?>
გატესტეთ ჩემ მიერ შექმნილი ავტომატური ჩატვირთვის ფუნქცია.
შექმენით საკუთარი ავტომატური ჩატვირთვის წესი და რეალიზაცია გაუწიეთ მას.