Nội dung tiêu chuẩn PHP PSR-4
Phần này diễn giải, ví dụ về Autoload PHP
Trước đây trong PHP việc nạp các file thư viện, mã dùng lại vào một file PHP khác thường dùng các lệnh include và require. Điều này thực sự mất thời gian và rắc rối. Tiếp theo từ PHP5 đã có các hàm trợ giúp tự động hóa việc gọi thư viện bằng các hàm như: spl_autoload_register, spl_autoload_functions, spl_autoload_extensions …
Từ các hàm này cùng với khái niệm namespace trong PHP, các lập trình viên xây dựng cho mình một bộ code tự động nạp. Tuy nhiên để dễ dàng chia sẻ dùng lại code giữa các framework, giữa các dự án …, cộng đồng PHP thống nhất một cách thức tự động nạp thư viện theo một chuẩn bố trí thư viện. Việc thống nhất đó hình thành một tiêu chuẩn nên tuân theo đó là PSR – 4 Autoload. Ngoài tiêu chuẩn tự động load PSR-4 còn có tiêu chuẩn tự động load theo PSR – 0 (tuy nhiên đã lỗi thời, các dự án mới không nên theo PSR – 0 nữa).
Ứng dụng của tiêu chuẩn này như sau: Phải có một có chế và cách bố trí code trong các thư mục sao cho mọi lớp (class) đều có thể được tham chiếu đến bằng cách viết mã như sau:
<NamespaceName>(<SubNamespaceNames>)*<ClassName>
Có nghĩa là mỗi lớp bạn phải xây dựng sao cho có thể được tham chiếu đến bởi dòng code ba thành phần: Namespace, Các SubNamespaceNames con, và tên lớp ClassName.
- NameSpace : Tiền đố đầu tiên bắt buộc phải có – được hiểu là tên vendor. Tên này do bạn tự đặt, sao cho không xung đột tên các thư viện khác.
- SubNameSpaces: Các namespace con (theo sau NameSpace đầu tiên – vendor). Có một hoặc nhiều tùy bạn. Nhưng bắt đầu từ SubNameSpace thì nó tương ứng với cấu trúc thư mục lưu trữ code. Ví dụ bạn lưu trữ code thư viện tại thư mục gốc là src, và gọi đến một lớp của bạn tên là cls1 với cú pháp như sau myvendornamespace1namespace2cls1 điều này có nghĩa là trong thư mục src có thư mục tên là namespace1, trong namespace1 có thư mục namespace2.
- ClassName: Bắt buộc phải có và phải có tên file PHP trùng tên ClassName ở thư mục tương ứng với namespace cuối cùng (ClassName.php), trong file đó sẽ định nghĩa nội dung của code của lớp.
Đó 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 famework khác nhau đều sử dụng một cơ chế tự động nạp tương tự nhau nên có thể dùng lại thư viện.
Đến đây trong dự án của bạn cần sử dụng một thư viện Autoload để tự động nạp cấu trúc trên khi cần dùng đến. Các Framework PHP hầu hết có sử dụng bộ tự động nạp theo PSR-4. Tham khảo mẫu Autoloader tự động đăng ký các lớp tự động tải vào khi dùng đến, với điều kiện các lớp viết theo PSR-4. Dùng Composer nó sẽ phát sinh mã tự động nạp thư viện theo PSR-4 cho bạn.
Tham khảo:
- Zend Framework 2 – Autoloader
- Symfony – Autoloader
- ACME Framework
- Lavarel Autoload
Ví dụ về PRS-4 trong PHP
Lưu ý sử dụng Composer để phát sinh code Autoload cho bạn. Nếu chưa cài đặt Composer thì đọc thêm: Composer.
Ở ví dụ này bạn xây dựng một lớp tên là Cat, sao cho khi cần gọi đến lớp đó thì chỉ cần viết dòng code myvendorsinhvatdongvatCat bạn làm như sau:
1) Tạo một thư mục dự án có tên prs4example
2) Tạo cấu trúc thư mục và file lưu giữ code lớp Cat như sau:
prs4example/mycode/sinhvat/dongvat/Cat.php
Trong thư mục dongvat tạo file php có tên Cat.php. Như vậy đã tạo ra cấu trúc theo chuẩn, và khi sử dụng bộ AutoLoader thì bất kỳ khi nào gọi đến lớp Cat bạn chỉ cần gọi đến nó theo cấu trúc chỉ ra lớp theo quy tắc trên hoặc dùng lệnh use.
Cập nhật nội dung file: Cat.php để trình bày code cho lớp Cat như sau:
<?php namespace myvendorsinhvatdongvat; class Cat { public function sound() { echo “MEO MEO”; } }
Giờ dùng Compose đệ tạo bộ Autoload. Tạo file composer.json với nội dung: