
Trong bài viết này, chúng ta sẽ thảo luận về những điều cơ bản về autoloading trong PHP và cách sử dụng lớp autoload trong PHP bằng Composer .Tôi sẽ giải thích lý do tại sao autoloading lại quan trọng như vậy và chỉ cho bạn cách sử dụng Composer để autoloading từng bước.Tôi sẽ giải thích sự khác biệt giữa những loại autoloading trong Composer.
Tại sao chúng ta cần Autoloading?
Khi bạn xây dựng các ứng dụng PHP, bạn có thể cần sử dụng các thư viện của bên thứ ba.Và như bạn đã biết, nếu bạn muốn sử dụng các thư viện này trong ứng dụng của mình, bạn cần đưa chúng vào các tệp nguồn của mình bằng cách sử dụng câu lệnh request hoặc include.
Các câu lệnh require hoặc include đều ổn miễn là bạn đang phát triển các ứng dụng nhỏ.Nhưng khi ứng dụng của bạn phát triển, danh sách các câu lệnh request hoặc include ngày càng dài ra, điều này hơi khó chịu và khó duy trì.Vấn đề khác với cách tiếp cận này là bạn đang load toàn bộ thư viện trong ứng dụng của mình, bao gồm cả những phần bạn thậm chí không sử dụng. Điều này dẫn đến bộ nhớ nặng hơn cho ứng dụng của bạn.
Để khắc phục vấn đề này, lý tưởng nhất là chỉ load các lớp khi chúng thực sự cần đến autoloading. Về cơ bản, khi bạn sử dụng một lớp trong ứng dụng của mình, autoloader sẽ kiểm tra xem nó đã được load chưa và nếu chưa, autoloader sẽ tải lớp cần thiết vào bộ nhớ.Vì vậy, lớp được load nhanh chóng khi cần thiết — đây được gọi là tự autoloading.Khi bạn đang sử dụng tính năng autoloading, bạn không cần phải đưa vào tất cả các tệp thư viện theo cách thủ công; bạn chỉ cần bao gồm tệp autoloader chứa logic của autoloading và các lớp cần thiết sẽ được đưa vào tự động.
Ở phần sau của bài viết này, chúng ta sẽ nhìn vào autoloading với Composer. Nhưng trước tiên, tôi sẽ giải thích cách bạn có thể thực hiện autoloading trong PHP mà không cần Composer.
Cách sử dụng Autoloading mà không cần Composer
Bạn có thể không nhận ra, nhưng có thể triển khai autoloading trong PHP mà không cần Composer.Hàm spl_autoload_register () là thứ làm cho điều này trở nên dễ dàng.Hàm spl_autoload_register () cho phép bạn đăng ký các hàm sẽ được đưa vào hàng đợi để được kích hoạt tuần tự khi PHP cố gắng load các lớp chưa được load.
Hãy xem qua ví dụ sau để hiểu cách hoạt động của nó.
1
2
3
4
5
6
7
8
9
|
<?php function custom_autoloader( $class ) { include 'lib/' . $class . '.php' ; } spl_autoload_register( 'custom_autoloader' ); $objFooBar = new FooBar(); ?> |
Trong ví dụ trên, chúng tôi đã sử dụng hàm custom_autoloader () làm autoloader tùy chỉnh của chúng tôi bằng cách sử dụng hàm spl_autoload_register ().Tiếp theo, khi bạn cố gắng khởi tạo lớp FooBar và lớp này vẫn chưa khả dụng, PHP sẽ thực thi tuần tự tất cả các chức năng của autoloader đã đăng ký.Và do đó, hàm custom_autoloader được gọi – nó bao gồm tệp lớp cần thiết, và cuối cùng đối tượng được khởi tạo. Đối với ví dụ này, chúng tôi giả định rằng lớp FooBar được định nghĩa trong tệp lib / FooBar.php.
Nếu không có autoloading, bạn sẽ cần sử dụng câu lệnh request hoặc include để đưa vào tệp lớp FooBar.Việc triển khai autoloader khá đơn giản trong ví dụ trên, nhưng bạn có thể xây dựng dựa trên điều này bằng cách đăng ký nhiều autoloader cho các loại lớp khác nhau.
Tuy nhiên, trong thực tế, bạn sẽ không thường xuyên viết trình autoloader của riêng mình. Đó là những gì Composer dành cho! Trong phần tiếp theo, chúng ta sẽ thảo luận về cách sử dụng Composer để autoloading trong PHP.
Cách thức hoạt động của tính năng Autoloading với Composer
Trước tiên, hãy đảm bảo cài đặt Composer trên hệ thống của bạn nếu bạn muốn làm theo các ví dụ. Khi nói đến autoloading với Composer, có nhiều phương pháp khác nhau mà bạn có thể chọn.
Cụ thể, Composer cung cấp bốn phương pháp khác nhau để tự động tải tệp:
- file autoloading
- classmap autoloading
- PSR-0 autoloading
- PSR-4 autoloading
Theo tài liệu Composer chính thức , PSR-4 là cách autoloading được khuyến nghị và chúng ta sẽ đi qua chi tiết điều đó trong phần tiếp theo. Trong phần này, chúng tôi sẽ thảo luận ngắn gọn về ba tùy chọn khác.
Trước khi tiếp tục, chúng ta hãy nhanh chóng xem qua các bước bạn cần thực hiện khi muốn sử dụng tính năng autoloading trong Composer.
- Xác định tệp composer.json trong thư viện gốc của dự án hoặc thư viện của bạn. Nó phải chứa các chỉ thị dựa trên loại autoloading. ● Chạy lệnh composer dump-autoload để tạo các tệp cần thiết mà Composer sẽ sử dụng autoloading.
- Bao gồm câu lệnh “nhà cung cấp / autoload.php” ở đầu tệp mà bạn muốn sử dụng tính năng autoloading.
Autoloading: The files Directive
Autoloading file hoạt động tương tự như include hoặc require các câu lệnh cho phép bạn tải toàn bộ tệp nguồn.Tất cả các tệp nguồn được tham chiếu với chỉ thị tệp sẽ được tải mỗi khi ứng dụng của bạn chạy. Điều này rất hữu ích để tải các tệp nguồn không sử dụng các lớp.
Để sử dụng tính năng autoloading file, hãy cung cấp danh sách các tệp trong chỉ thị tệp của tệp composer.json, như được hiển thị trong đoạn mã sau.
1
2
3
4
5
|
{ "autoload" : { "files" : [ "lib/Foo.php" , "lib/Bar.php" ] } } |
Như bạn có thể thấy, chúng tôi có thể cung cấp danh sách các tệp trong lệnh tệp mà chúng tôi muốn autoloading bằng Composer.Sau khi bạn tạo tệp composer.json trong thư mục gốc dự án của mình với nội dung trên, bạn chỉ cần chạy lệnh composer dump-autoload để tạo các tệp autoloader cần thiết.Chúng sẽ được tạo trong thư mục vendor. Cuối cùng, bạn cần bao gồm câu lệnh ‘vendor / autoload.php’ ở đầu tệp nơi bạn muốn autoloader file bằng Composer, như được hiển thị trong đoạn mã sau.
1
2
3
4
5
|
<?php require 'vendor/autoload.php' ; // code which uses things declared in the "lib/Foo.php" or "lib/Bar.php" file ?> |
Câu lệnh ‘vendor / autoload.php’ đảm bảo rằng các tệp cần thiết được tải động.
Autoloading: The classmap Directive
Autoloading Classmap là một phiên bản cải tiến của autoloading file. Bạn chỉ cần cung cấp danh sách các thư mục và Composer sẽ quét tất cả các tệp trong các thư mục đó.Đối với mỗi tệp, Composer sẽ tạo danh sách các lớp có trong tệp đó và bất cứ khi nào cần một trong các lớp đó, Composer sẽ autoload file tương ứng.
Hãy nhanh chóng sửa đổi tệp composer.json để hiển thị autoloader classmap.
1
2
3
4
5
|
{ "autoload" : { "classmap" : [ "lib" ] } } |
Chạy lệnh composer dump-autoload và Composer sẽ đọc các tệp trong thư mục lib để tạo bản đồ các lớp có thể autoloaded.
Autoloading: PSR-0
PSR-0 là tiêu chuẩn được nhóm PHP-FIG khuyến nghị autoloading. Trong tiêu chuẩn PSR-0, bạn phải sử dụng không gian tên để xác định thư viện của mình. Tên lớp đủ điều kiện phải phản ánh cấu trúc \ <Vendor Name> \ (<Namespace> \) * <Class Name>.Ngoài ra, các lớp của bạn phải được lưu trong các tệp theo cùng cấu trúc thư mục với cấu trúc của không gian tên.
Hãy xem tệp composer.json sau đây.
1
2
3
4
5
6
7
|
{ "autoload" : { "psr-0" : { "Tutsplus\\Library" : "src" } } } |
Ví dụ: nếu bạn muốn xác định lớp Foo trong thư mục src \ Tutsplus \ Library, bạn cần tạo tệp src \ Tutsplus \ Library \ Foo.php như được hiển thị trong đoạn mã sau: Trong autoloading PSR-0, bạn cần tham chiếu không gian tên đến thư mục. Trong ví dụ trên, chúng tôi đang nói với Composer rằng bất kỳ thứ gì bắt đầu với không gian tên Tutsplus \ Library sẽ có sẵn trong thư mục src \ Tutsplus \ Library.
1
2
3
4
5
6
7
8
|
<?php namespace Tutsplus\Library; class Foo { //... } ?> |
Như bạn có thể thấy, lớp này được định nghĩa trong không gian tên Tutsplus \ Library. Ngoài ra, tên tệp tương ứng với tên lớp. Hãy xem nhanh cách bạn có thể autoload lớp Foo.
1
2
3
4
5
|
<?php require 'vendor/autoload.php' ; $objFoo = new Tutsplus\Library\Foo(); ?> |
Composer sẽ autoload lớp Foo từ thư mục src \ Tutsplus \ Library.
Vì vậy, đó là giải thích ngắn gọn về tự động tải tệp, sơ đồ lớp và PSR-0 trong Composer. Trong phần tiếp theo, chúng ta sẽ xem cách thức hoạt động của tính năng autoloading PSR-4.
Cách thức hoạt động của tính năng Autoloading PSR-4 với Composer
Trong phần trước, chúng ta đã thảo luận về cách thức hoạt động của tính năng autoloading PSR-0. PSR-4 tương tự như PSR-0 tự động điền ở chỗ bạn cần sử dụng namespaces, nhưng bạn không cần phải bắt chước cấu trúc thư mục với namespaces.
Trong autoloading PSR-0, bạn phải ánh xạ không gian tên với cấu trúc thư mục. Như chúng ta đã thảo luận trong phần trước, nếu bạn muốn autoload lớp Tutsplus \ Library \ Foo, nó phải được đặt tại src \ Tutsplus \ Library \ Foo.php.Trong autoloading PSR-4, bạn có thể rút ngắn cấu trúc thư mục, dẫn đến cấu trúc thư mục đơn giản hơn nhiều so với autoloading PSR-0.
Chúng tôi sẽ sửa đổi ví dụ ở trên — xem bạn có thể phát hiện ra sự khác biệt không.
Đây là giao diện của tệp composer.json với tính năng autoloading PSR-4.
1
2
3
4
5
6
7
|
{ "autoload" : { "psr-4" : { "Tutsplus\\Library\\" : "src" } } } |
Điều quan trọng cần lưu ý là chúng tôi đã thêm dấu gạch chéo ngược ở cuối namespaces.Tham chiếu ở trên cho Composer biết rằng bất cứ thứ gì bắt đầu với namespace Tutsplus \ Library sẽ có sẵn trong thư mục src. Vì vậy, bạn không cần tạo thư mục Tutsplus và Libary.Ví dụ: nếu bạn yêu cầu lớp Tutsplus \ Library \ Foo, Composer sẽ cố gắng tải tệp src \ Foo.php.
Điều quan trọng cần hiểu là lớp Foo vẫn được xác định trong namespaces Tutsplus \ Library; chỉ là bạn không cần phải tạo các thư mục bắt chước các không namespaces.Nội dung tệp src \ Foo.php sẽ giống với nội dung của tệp src \ Tutsplus \ Library \ Foo.php trong phần trước.
Như bạn thấy, PSR-4 dẫn đến cấu trúc thư mục đơn giản hơn nhiều, vì bạn có thể bỏ qua việc tạo các thư mục lồng nhau trong khi vẫn sử dụng các namespaces đầy đủ.
PSR-4 là cách autoloading được khuyến nghị và nó được chấp nhận rộng rãi trong cộng đồng PHP. Bạn nên bắt đầu sử dụng nó trong các ứng dụng của mình nếu bạn chưa làm như vậy!
Phần kết luận
Hôm nay, chúng ta đã thảo luận về autoloading trong PHP. Bắt đầu với việc giới thiệu các loại kỹ thuật autoloading của Composer, chúng tôi đã thảo luận chi tiết về các tiêu chuẩn autoloading PSR-0 và PSR-4 trong nửa sau của bài viết
Nguồn :https://code.tutsplus.com/tutorials/how-to-autoload-classes-with-composer-in-php–cms-35649