Hướng dẫn dùng loading class trong PHP

Trong lập trình hướng đối tượng với PHP chúng ta thường cố gắng tách các đối tượng ra các file riêng biệt và khi cần đến đối tượng nào thì chúng ta thường include hoặc require chúng vào file thực thi. Từ PHP 5 trở đi bạn có thể sử dụng 1 kỹ thuật khác để làm điều tương tự như vậy đó là autoloading.

 Bạn có thể thực hiện autoloading các class cần thiết bằng cách tự code hoặc sử dụng composer để thực hiện. Trong bài viết này chúng ta sẽ thực hiện autoloading thủ công để các bạn có thể hiểu được cơ chế hoạt động của autoloading trong PHP.

Ví dụ thay vì phải sử dụng hàm include để nạp các file cần thiết như bên dưới

 chúng ta có thể tự động hóa việc này bằng cách sử dụng hàm spl_autoload_register(), hàm này hiện đang được recommend trong PHP 7 để thay thế cho hàm auto_load() của PHP 5

bark();

Đoạn mã trên hoạt động như thế nào?

  • Đầu tiên chúng ta chỉ định đường dẫn đến các file PHP mà chúng ta sẽ tự động load khi nó được gọi thông qua hàm spl_autoload_register(), PHP sẽ truyền class name cần nạp thông qua tham số $className, hiển nhiên là bạn có thể đặt nó thành một tên bất kỳ nào khác.
  • Tiếp theo chúng ta có thể sử dụng các hàm sau để include file vào 
    1. require
    2. require_once
    3. include
    4. include_once
  • Tất cả các hàm này đều có ưu và nhược điểm riêng và lý tưởng nhất là bạn nên sử dụng hàm include_one bởi khi sử dụng hàm này bạn không lo xảy ra lỗi nếu gọi nạp cùng 1 file nhiều lần.
  • Khi bạn khởi tạo hoặc gọi đến tên class nào đó, hàm callback trong spl_autoload_register sẽ được gọi để nạp file chứa class đó vào trình thông dịch.

Nếu có nhiều hàm callback autoload, PHP sẽ tạo 1 queue và thực hiện lần lượt theo thứ tự hàm callback được định nghĩa trong lời gọi hàm 

 cho đến khi nó tìm được class, và nếu sau khi chạy qua tất cả autoload mà không tìm thấy class thì sẽ có exception class not found.

VD nhiều autoload callback, load class trong 2 thư mục includes và classes

src
├── classes
│   └── MyClass.php
├── includes
├── index.php

 Output

Try to load /tmp/autoload/src/includes/MyClass.php
Try to load /tmp/autoload/src/classes/MyClass.php 

Với hàm _autoload bạn cũng thực hiện tương tự như vậy, tuy nhiên hàm này không còn được khuyên dùng do nó dễ gây ra lỗi conflict nếu như có 1 chỗ nào đó cũng gọi hàm này trong code.

Trong lập trình hướng đối tượng với PHP chúng ta thường cố gắng tách các đối tượng ra các file riêng biệt và khi cần đến đối tượng nào thì chúng ta thường include hoặc require chúng vào file thực thi. Từ PHP 5 trở đi bạn có thể sử dụng 1 kỹ thuật khác để làm điều tương tự như vậy đó là autoloading.

 Bạn có thể thực hiện autoloading các class cần thiết bằng cách tự code hoặc sử dụng composer để thực hiện. Trong bài viết này chúng ta sẽ thực hiện autoloading thủ công để các bạn có thể hiểu được cơ chế hoạt động của autoloading trong PHP.

Ví dụ thay vì phải sử dụng hàm include để nạp các file cần thiết như bên dưới

 chúng ta có thể tự động hóa việc này bằng cách sử dụng hàm spl_autoload_register(), hàm này hiện đang được recommend trong PHP 7 để thay thế cho hàm auto_load() của PHP 5

bark();

Đoạn mã trên hoạt động như thế nào?

  • Đầu tiên chúng ta chỉ định đường dẫn đến các file PHP mà chúng ta sẽ tự động load khi nó được gọi thông qua hàm spl_autoload_register(), PHP sẽ truyền class name cần nạp thông qua tham số $className, hiển nhiên là bạn có thể đặt nó thành một tên bất kỳ nào khác.
  • Tiếp theo chúng ta có thể sử dụng các hàm sau để include file vào 
    1. require
    2. require_once
    3. include
    4. include_once
  • Tất cả các hàm này đều có ưu và nhược điểm riêng và lý tưởng nhất là bạn nên sử dụng hàm include_one bởi khi sử dụng hàm này bạn không lo xảy ra lỗi nếu gọi nạp cùng 1 file nhiều lần.
  • Khi bạn khởi tạo hoặc gọi đến tên class nào đó, hàm callback trong spl_autoload_register sẽ được gọi để nạp file chứa class đó vào trình thông dịch.

Nếu có nhiều hàm callback autoload, PHP sẽ tạo 1 queue và thực hiện lần lượt theo thứ tự hàm callback được định nghĩa trong lời gọi hàm 

 cho đến khi nó tìm được class, và nếu sau khi chạy qua tất cả autoload mà không tìm thấy class thì sẽ có exception class not found.

VD nhiều autoload callback, load class trong 2 thư mục includes và classes

src
├── classes
│   └── MyClass.php
├── includes
├── index.php

 Output

Try to load /tmp/autoload/src/includes/MyClass.php
Try to load /tmp/autoload/src/classes/MyClass.php 

Với hàm _autoload bạn cũng thực hiện tương tự như vậy, tuy nhiên hàm này không còn được khuyên dùng do nó dễ gây ra lỗi conflict nếu như có 1 chỗ nào đó cũng gọi hàm này trong code.

  • Posted by: Khanh Hoang
  • Wed, 6/03/2013, 10:21 (GMT+7)
  • 0 Bình luận

Hướng đối tượng trong PHP: autoloading classes

Với cách viết thông thường thì khi bạn gọi một lớp nào đó từ file khác bạn phải dùng hàm include tới từng file một sau đó mới có thể sử dụng. Đối với những dự án lớn có một cách thực hành tốt khác trong PHP đó là bạn chỉ tải file chứa class khi cần thiết có nghĩa là bạn không cần phải khai báo include bằng tay nữa mà nó sẽ được thực hiện tự động,  tính năng đang được nói đến ở đây là autoloading classes được giới thiệu trong PHP5.

Chúng ta hãy cùng xem xét ví dụ sau để hiểu rõ hơn về vấn đề này:

Tạo file class.auto.php như sau:

class Auto{
 public $a ='Khuong';
 public function show(){
    echo $this->a;
 }
}

Tạo file class.auto2.php như sau:

class Auto2{
  public $a ='Ngo Van Khuong';
  public function show2(){
    echo $this->a;
  }
}

Hai file class.auto.php và class.auto2.php nằm cùng trong thư mục, giả sử ở đây là thư mục classes.

Tạo file a.php nằm cùng cấp với thư mục classes.

Với cách thông thường chúng ta sẽ làm như sau:

inlude_once 'classes/class.auto.php';
inlude_once 'classes/class.autos.php';
$s = new Auto();
$s->show();
$s2 = new Auto2();
$s2->show2();

Với cách sử dụng auto load chúng ta sẽ làm như sau:

function __autoload($class){
    include_once "classes/class.$class.php";
}
$s = new Auto();
$s->show();
$s2 = new Auto2();
$s2->show2();

Với cách thực hiện này bạn có thể gọi tùy ý một lớp bất kỳ mà không cần quan tâm file đó đã được include hay chưa.

Bạn thấy bài viết này như thế nào?: 

Khanh Hoang - Kenn

Kenn is a user experience designer and front end developer who enjoys creating beautiful and usable web and mobile experiences.