Hướng dẫn dùng php autoload trong PHP

Trong phiên bản PHP 7.2 hàm này đã không còn được khuyên dùng nữa, thay vào đó hãy sử dụng hàm spl_autoload_register[].

Cú pháp

Cú pháp hàm __autoload[] trong PHP như sau:

__autoload [ string $class ] : void

Tham số truyền vào 

  • $class  là tên class muốn tải.

Giá trị trả về

Hàm này không có giá trị trả về

Ví dụ minh họa

Với ví dụ trên bạn có thể thấy với class được định nghĩa rõ ràng thì hàm __autoload sẽ không được chạy. Vậy ở ví dụ 2 thì sao ?

function __autoload[$className] 
{ 
echo 'Class name construct: ' . $className;
 }
} $human = new Human[];
 //return Class name construct Human

Ở ví dụ 2 này bạn có thể thấy khi class không được định nghĩa rõ ràng thì hàm __autoload sẽ được chạy.

Ứng dụng

Bạn có thể sử dụng __autoload[] include file class nhanh hơn đồng thời giúp code dễ đọc hơn.

Ở ví dụ này cơ bản bạn đã hiểu cách sử dụng hàm __autoload[], code ngắn hơn dễ hiểu hơn.

Tuy nhiên ở từ phiên bản PHP 7.2 hàm __autoload[] đã không còn được khuyến cáo sử dụng nữa, vì vậy bạn có thể sử dụng hàm sau spl_autoload_register[] để thay thế.

Các hàm liên quan

  • Hàm spl_autoload_register[] một hàm thay thế cho hàm __autoload[].

Hi vọng với bài viết này, bạn đã hiểu rõ cách sử dụng hàm __autoload[] trong PHP. Nếu thấy bài viết hay và ý nghĩa, hãy like và chia sẻ với bạn bè để mọi người cùng nhau học tập nhé.

Autoload [Lazy loading ] trong PHP, khi bạn khai báo hàm autoload này thì bạn chỉ việc gọi class mà không cần phải gọi file

Chẳng hạn trong file myClass.php bạn viết class myClass, nếu như thông thường khi bạn muốn dùng class myClass này thì bạn phải require hoặc include gọi file phpbasic.php vào để sử dụng

     require["myClass.php"]; // gọi file 

     $php = new myClass.php[]; // khởi tạo đối tượng

Nhưng khi bạn khai báo hàm __autoload, thì bạn chỉ việc khởi tạo đối tượng mà không cần require file nữa vì hàm _autoload đã tự động gọi cho bạn

- Class myClass trong file myClass.php

 public function __construct[]{

- Khởi tạo class myClass mà không cần gọi file

function __autoload[$class]{

Ở ví dụ trên ta thấy hàm __autoload tự động gọi file phpbasic.php ra, chúng ta chỉ việc khởi tạo lại class basic

- Note : Chú ý khi sử dụng autoload thì tên file và tên class phải giống nhau nhé

Đó là autoload trong cùng một folder, vậy thì khi gọi một class trong một folder khác thì phải làm thế nào? ví dụ ta có một folder là models, trong folder có file user.php

 public function __construct[]{

- Để sử dụng dc autoload cho trường hợp này ts cần phải đổi lại tên class sao cho phù hợp với đường dẫn đến file. Ở đây file user.php nằm trong thư mục models nên ta đổi tên class user thành class models_user

 public function __construct[]{

- Các bạn chú ý models_user là tên class và cũng chính là đường dẫn đến file user.php lúc này ta cần phải thêm một chút vào hàm _autoload, chúng ta sử dụng str_replace ký tự gạch dưới của models_user thành models/user

function __autoload[$class]{

 $class = str_replace["_","/",$class];

$php = new models_user[];

- Lúc này khi ta khởi tạo lại lớp models_user thì nó sẽ tự gọi file user.php trong models ra, và đây là kết quả:

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 includerequire. Đ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_registerspl_autoload_functions

prs4example/mycode/sinhvat/dongvat/Cat.php
0 ...

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:

\[\]*\

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
    prs4example/mycode/sinhvat/dongvat/Cat.php
    
    1.  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à
    prs4example/mycode/sinhvat/dongvat/Cat.php
    
    2, và gọi đến một lớp của bạn tên là cls1 với cú pháp như sau
    prs4example/mycode/sinhvat/dongvat/Cat.php
    
    3 điều này có nghĩa là trong thư mục
    prs4example/mycode/sinhvat/dongvat/Cat.php
    
    2 có thư mục tên là
    prs4example/mycode/sinhvat/dongvat/Cat.php
    
    5, trong namespace1 có thư mục
    prs4example/mycode/sinhvat/dongvat/Cat.php
    
    6.
  • 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:

Ví dụ về PRS-4 trong PHP

Lưu ý sử dụng

prs4example/mycode/sinhvat/dongvat/Cat.php
7 để 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

prs4example/mycode/sinhvat/dongvat/Cat.php
8 bạn làm như sau:

1] Tạo một thư mục dự án có tên

prs4example/mycode/sinhvat/dongvat/Cat.php
9

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


Giờ dùng Compose đệ tạo bộ Autoload. Tạo file composer.json với nội dung:

{
 "autoload": 
 {
        "psr-4": { "myvendor\\": "mycode/" }
 }
}
0 tạo file php có tên

Giờ dùng Compose đệ tạo bộ Autoload. Tạo file composer.json với nội dung:

{
 "autoload": 
 {
        "psr-4": { "myvendor\\": "mycode/" }
 }
}
1. 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:


Giờ dùng Compose đệ tạo bộ Autoload. Tạo file composer.json với nội dung:

{
 "autoload": 
 {
        "psr-4": { "myvendor\\": "mycode/" }
 }
}
1 để trình bày code cho lớp Cat như sau:


Giờ dùng Compose đệ tạo bộ Autoload. Tạo file composer.json với nội dung:

{
 "autoload": 
 {
        "psr-4": { "myvendor\\": "mycode/" }
 }
}

Rồi từ dòng lệnh cmd gõ


Giờ dùng Compose đệ tạo bộ Autoload. Tạo file composer.json với nội dung:

{
 "autoload": 
 {
        "psr-4": { "myvendor\\": "mycode/" }
 }
}
3. Lúc này nó sẽ sinh ra

Giờ dùng Compose đệ tạo bộ Autoload. Tạo file composer.json với nội dung:

{
 "autoload": 
 {
        "psr-4": { "myvendor\\": "mycode/" }
 }
}
4 trong thư mục
prs4example/mycode/sinhvat/dongvat/Cat.php
1.

Giờ thì bạn có thể sử dụng Autoload để nạp thư viện của bạn rồi.

Tạo file index.php trong psr4example với nội dung

sound[];

Chạy đoạn code trên, sẽ in ra màn hình dòng Meo Meo. Thư viện đã nạp chính xác. Tốt hơn bạn nên khai báo use khi sử dụng ở bất kỳ đâu, nghĩa là thay đổi code theo dạng này.

use myvendor\sinhvat\dongvat\Cat;
include '/vendor/autoload.php';
$cat = new Cat[];
$cat->sound[];

Nếu muốn đưa thư viên của bạn vào chính thư mục vendor thì di chuyển toàn bộ thư mục mycode vào vendor và trong composer.json cập nhật lại dòng khai báo.

Chủ Đề