Hàm tự động tải lớp tự tạo trong OOP PHP
Thông thường, chức năng tự động tải mặc định có thể không phù hợp với bạn vì một số lý do. Trong trường hợp như vậy, bạn có thể tự viết hàm tự động tải của mình.
Để làm điều này, cần truyền hàm callback do bạn viết
vào tham số đầu tiên của hàm spl_autoload_register.
Hàm này sẽ được gọi
khi PHP phát hiện có yêu cầu truy cập vào
một lớp chưa được tải. Tên lớp kèm namespace
sẽ được truyền vào tham số của hàm này:
<?php
spl_autoload_register(function($class) {
// biến $class sẽ chứa tên lớp cùng với namespace
});
?>
Và nhiệm vụ của hàm là dựa trên tên lớp
để thực hiện tải lớp đó thông qua require.
Tức là bên trong hàm này, chúng ta cần viết
quy tắc tải lớp riêng, hay nói cách khác là
quy ước đặt tên riêng của chúng ta.
Hãy viết một ví dụ về hàm tự động tải tự tạo. Giả sử, ví dụ chúng ta quy định rằng đường dẫn đến tệp lớp tính từ thư mục gốc của trang web sẽ giống với namespace, nhưng giữ nguyên chữ hoa chữ thường.
Tức là, nếu chúng ta có lớp Core\Admin\PageController,
thì đường dẫn đến nó phải là Core/Admin/PageController.php.
Như bạn thấy, để chuyển đổi tên lớp
cùng namespace của nó, chỉ cần đổi
dấu gạch chéo ngược thành dấu gạch chéo xuôi, và thêm
.php vào tên lớp. Hãy thực hiện điều đó:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Tuy nhiên, chúng ta sẽ có đường dẫn tương đối đến tệp (tương đối so với thư mục gốc trang web). Tốt hơn nên tạo đường dẫn tuyệt đối, như thế này:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Còn một điểm cần lưu ý. Trên các hệ điều hành khác nhau,
đường dẫn thư mục có thể sử dụng dấu gạch chéo xuôi
hoặc dấu gạch chéo ngược. Hãy làm cho mã của chúng ta độc lập
với hệ điều hành. Để làm điều này, thay vì
dấu gạch chéo xuôi để phân tách đường dẫn, chúng ta sẽ
sử dụng hằng số DIRECTORY_SEPARATOR,
chứa dấu phân cách đường dẫn đúng cho hệ điều hành
mà script của chúng ta đang chạy.
Cuối cùng, chúng ta có mã như sau:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Hãy thử nghiệm hàm tự động tải do tôi tạo.
Hãy nghĩ ra quy tắc tự động tải của riêng bạn và triển khai nó.