Autoload trong php là gì
Trong lập trình hướng đối tượng với PHP chúng ta thường cố gắng tách các đối tượng ra các file riêng biệt và khi cần đến đối tượng nào thì chúng ta thường include hoặc require chúng vào file thực thi. Từ PHP 5 trở đi bạn có thể sử dụng 1 kỹ thuật khác để làm điều tương tự như vậy đó là autoloading. Bạn có thể thực hiện
autoloading các class cần thiết bằng cách tự code hoặc sử dụng composer để thực hiện. Trong bài viết này chúng ta sẽ thực hiện autoloading thủ công để các bạn có thể hiểu được cơ chế hoạt động của autoloading trong PHP. Ví dụ thay vì phải sử dụng hàm include để nạp các file cần thiết như bên dưới chúng ta có thể tự động hóa việc này bằng cách sử dụng hàm spl_autoload_register(), hàm này hiện đang được recommend trong PHP 7 để thay thế cho hàm auto_load() của PHP 5 bark(); Đoạn mã trên hoạt động như thế nào?
Nếu có nhiều hàm callback autoload, PHP sẽ tạo 1 queue và thực hiện lần lượt theo thứ tự hàm callback được định nghĩa trong lời gọi hàm cho đến khi nó tìm được class, và nếu sau khi chạy qua tất cả autoload mà không tìm thấy class thì sẽ có exception class not found.VD nhiều autoload callback, load class trong 2 thư mục includes và classes src ├── classes │ └── MyClass.php ├── includes ├── index.php
Với cách này, bạn chỉ có thể có định nghĩa 1 function spl_autoload_register
Khác với Như bạn thấy, function này sẽ nhận tham số là một callback function, callback này có nhiệm vụ giống như VD thay thế cho
VD nhiều autoload callback, load class trong 2 thư mục
Output khi chạy:
Nếu thay đổi thứ tự autoload callback:
Output thế nào chắc các bạn cũng biết được. Trường hợp class không tồn tại:
=>
PSR-4Việc mỗi người, mỗi dự án có một cách thức thực hiện
autoloading làm cho việc chia sẻ dùng lại code giữa các framework, thư viện trở nên phức tạp. Do đó, chuẩn PSR-4 Autoloader được tạo ra để thống nhất một quy tắc trong việc thực hiện autoloading. Các framework như Laravel, Symfony, Phalcon... đều dùng chuẩn này (tham khảo file Nội dung chính của chuẩn PSR-4 đó là: Quy tắc tổ chức các thư mục code sao cho mọi class (bao gồm class, interface, trait) đều có thể được tham chiếu đến bằng cách viết mã như sau:
Ví dụ về cách tổ chức:
Sự khác biệt chủ yếu của PSR-0 so với PSR-4 đó là, PSR-0 không có khái niệm namespace prefix nên cấu trúc namespace sẽ tương ứng với cấu trúc thư mục chứa class. Ngoài ra PSR-0 còn sử dụng thêm dấu gạch dưới VD về cách tổ chức class theo PSR-0:
Đó là cách thống nhất viết bố trí code PHP trên các thư mục và theo các namespace. Khi đã viết code tuân thủ theo hướng dẫn này thì các framework khác nhau đều sử dụng một cơ chế tự động nạp tương tự nhau nên việc chia sẻ, tích hợp là rất linh hoạt. Ví dụ implement một autoloader (source):
Autoloading với ComposerĐể thực hiện autoloading với Composer bạn cần khai báo trong file Ở đây, mình sẽ ví dụ autoload PSR-4 với Composer. Ví dụ bạn có cấu trúc thư mục như sau:
File
Tương tự file
Thư mục Views gồm những file markup PHP, Html nên sẽ không thực hiện autoload. Tiếp theo, chúng ta có file
Sau đó chạy lệnh:
Câu lệnh này sẽ tạo ra file autoloader
Sử dụng
Autoload optimizingVới các quy tắc PSR-0, PSR-4, autoloader cần phải check sự tồn tại của class file trong filesystem trước khi load class. Việc này có thể làm chậm tốc độc của application một chút, nhưng bù lại nó làm cho việc develop dễ dàng hơn khi bạn thêm một class và có thể sử dụng nó ngay lập tức mà không phải rebuild autoloader. Vấn đề ở đây là, trong môi trường production, bạn thường muốn app của mình chạy nhanh nhất có thể, vì môi trường này ít khi thay đổi và bạn có thể dễ dàng rebuild lại autoloader khi deploy. Vì lý do này, Composer cung cấp vài phương pháp để optimize autoloader. Mình sẽ giới thiệu 1 phương pháp thường được sử dụng nhất. Optimization Level 1: Class map generationLàm sao để bật chế độ này?Có một vài tùy chọn để bạn bật chế độ optimization này:
Nó hoạt động như thế nào?Composer sẽ convert các rule PSR-4/PSR-0 sang classmap rule. Các bạn có thể xem file Với PHP 5.6+, Composer còn thực hiện cache classmap trong Nhược điểmKhông có nhược điểm thực sự với phương pháp này, và bạn nên luôn luôn dùng nó trong môi trường production. Một vấn đề nhỏ với ở đây là, nếu class không tồn tại trong classmap, nó sẽ có fallback về PSR-4 rule, tức là tiếp tục follow theo PSR-4 rule và có thể phát sinh filesystem check. Để giải quyết vấn đề này Composer cung cấp thêm 2 phương pháp optimize level 2 đó là Level 2/A: Authoritative class
maps (loại bỏ fallback về PSR-4 rule) và Level 2/B: APCu cache (sử dụng
Kết luậnCó thể nói Autoloading là một feature của "modern" PHP. Hy vọng qua bài viết này các bạn có thể áp dụng nhiều hơn vào các project của mình. Reference:
|