Hướng dẫn autoloading php
Trong bài viết lần này, chúng ta sẽ cùng nhau tìm hiểu về autoload trong PHP. Show 1. Modules in PHP1.1 Code in one fileChúng ta đều biết PHP là scripting language, nghĩa là trong quá trình thực thi một ứng dụng PHP, sẽ không có bước compile cái sourcecode PHP sang thành a,b,c,x,y,z gì cả. Thay vào đó, chúng ta sẽ một intepreter nó sẽ đọc qua cái sourcecode PHP của chúng ta từ trên xuống và thực thi các dòng lệnh. Giả sử ta có
một đoạn code chứa một user-defined function như sau, đặt trong file
Để chạy nó, ta đơn giản chỉ định cho intepreter của php thực thi file này:
1.2 Code in multiple filesViệc đặt tất cả code trong một file sẽ khiến file ngày càng dài, và tới một mức sẽ rất khó để maintain cũng như scale. Việc chia nhỏ sourcecode ra thành nhiều files trở thành một nhu cầu tất yếu. PHP đã phát triển tính năng để hỗ trợ việc chia nhỏ này : 1.2.1. include...after included, all functions and classes defined in the included file have the global scope. Với include, ví dụ bên trên sẽ được viết lại như sau :
1.2.2 require
1.2.3 require_once & include_once
2. Autoload in native PHPGiả sử ta có một ứng dụng với 2 files code như này :
Ta sử dụng nó ở file
Mọi thứ trong vẫn rất clean, nhưng thử tượng tượng, chúng ta có khoảng vài chục class cần sử dụng, đều này đồng nghĩa, là một danh sách require rất dài ở mỗi đầu file, kiểu như vầy :
Về mặt lý thuyết thì nó không sai, chỉ là mọi người vẫn tự hỏi là có cách nào ngắn gọn mà vẫn đạt được cùng một kết quả không? Câu trả lời là spl_autoload_register 2.1 spl_autoload_registerTính năng mà function này hỗ trợ, rất clean và straightforward. Mỗi khi một class được sử dụng trong file, và intepreter thất bại trong việc tìm thấy định nghĩa của class, nó sẽ gọi cái spl_autoload_register này, để thử thêm một lần nữa. Ví dụ bên trên của chúng ta sẽ được viết lại như sau :
Đoạn code bên trên được đọc như sau, nếu không tìm thấy class Person, thì hãy thử require file có tên là tên của class Person cộng với hậu tố 3. Composer autoloadThay vì phải tự implement autoloader, bây giờ chúng ta sẽ sử dụng tính năng autoload được cung cấp bởi Composer. các ví dụ bên dưới đây sẽ giả định là bạn đã có cài đặt composer 3.1 Autoload fileBây giờ chúng ta hãy thử viết lại ví dụ ban đầu,
Và sử dụng nó ở file
Bây giờ, ta sẽ thay
thế dòng
Sau đó, chạy câu lệnh:
Lúc này, ta sẽ nhận được một folder
Vì chúng ta đang sử dụng tính năng autoload file, nên ta sẽ chỉ quan tâm tới file
Ta sẽ thấy một cái gì đó đại khái là có đường dẫn đi tới
Giờ thì chạy Ta sẽ tự hỏi là nó có khác gì so với cách làm trước? Về tính năng thì y hệt, nó chỉ khác là kể từ đây, mỗi khi muốn load một file mới, ta sẽ cập nhật lại file 3.2 Autoload classĐể demo cho tính năng autoload class này, đầu tiên ta cần chuẩn bị một folder classes, trong đó chứa file Person.php với nội dung code tương tự như ví dụ ở trên.
Sau đó, chúng ta sẽ cập lại file
Sau đó, chạy câu lệnh
Ta lại thấy thứ gì đó, đại loại là đường dẫn đi tới file Person.php. Giờ ta hãy thử sử dụng class Person đó, một điều thú vị là ta không cần phải động gì tới chỗ require, cứ việc dùng cái class Person thôi, mọi thứ đã có composer lo:
Tới đây, sau khi chạy 3.3 PSR-4PSR-4 is the recommended way since it offers greater ease of use (no need to regenerate the autoloader when you add classes). Sử dụng cái psr-4 này, thì mỗi lần thêm class, ta sẽ không cần phải chạy lại câu lệnh Đây cũng chính
là nội dung chính của bài viết lần này, có thể xem như the state of the art của php autoload. Ok, giờ chúng ta bắt đầu trải nghiệm thử tính năng này. Cập nhật lại file
Tạo một folder app, trong folder app sẽ tạo folder Models và trong folder Models sẽ tạo file Person.php
Nội dung của file Person.php có thể rút gọn như sau:
Trong file index.php, ta thử sử dụng nó:
Tới đây, mọi thứ vẫn như cũ, chỉ khác một điều, là giờ ta thử tạo thêm folder và file, thì không cần phải chạy lại câu lệnh
Ví dụ, giờ ta muốn tạo Controllers, thì sẽ làm như sau:
Nội dung file
Và khi sử dụng:
Và cứ như vậy, ta cứ tạo folder mới, file mới thoải mái, chỉ cần follow theo đúng rules thì mọi việc autoload cứ để composer lo 4. ConclusionOk, tới đây thì chúng ta xem như kết thúc bài viết lần này. Ngày nay thì gần như mọi framework đều follow theo psr-4 để thực hiện autoload, mà
cụ thể là đều sử dụng composer. Việc hiểu được cách composer psr-4 autoload hoạt động sẽ giảm bớt cảm giác |