Cách sử dụng lớp Autoload với Composer trong PHP

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:  

  1. file autoloading
  2. classmap autoloading
  3. PSR-0 autoloading
  4. 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