DANH MỤC: PHP HƯỚNG ĐỐI TƯỢNG

Bài 17: Hàm __autoload() trong PHP


Như đã được học từ trước thì các bạn cũng đã biết nếu muốn khởi tạo một class được khai báo trong một file khác thì chúng phải nhúng file đó vào trong file muốn khởi tạo thì mới có thể sử dụng được, nhưng nếu như chúng ta khởi tạo nhiều class trong một files mà các class đó được khai báo từ các file khác nhau thì sẽ phải include rất nhiều file. Điều đó sẽ khiến cho code của chúng ta trở lên rất rối và để khắc phục được điều đó thì chúng sẽ sử dụng hàm __autoload() trong PHP.

1, __autoload() là gì?

- __autoload() là một hàm đặc biệt được PHP giới thiệu từ phiên bản 5.0, hàm __autoload() này sẽ được gọi khi chúng ta khởi tạo một đối tượng không xác định được. Vì __autoload() là một hàm nên chúng ta sẽ khai báo nó như một hàm bình thường.

Cú Pháp:

function __autoload($clasName)
{
    //code
}

Trong đó: $className là biến mà các bạn truyền vào để lấy ra tên class(tên biến là gì cũng được nhưng bắt buộc phải khai báo).

-Và để chứng minh cho câu nói: 'nó được gọi khi chúng ta khởi tạo một đối tượng không xác định được' thì các bạn xem ví dụ sau:

+Đầu tiên chúng ta khai báo hàm__autoload và classConNguoi trên cùng một file và đồng thời khởi tạo luôn class ConNguoi.

<?php

//Khai báo hàm __autoload
function __autoload($className)
{
    echo 'Bạn vừa khởi tạo class: ' . $className;
}

//Khai báo class ConNguoi
class ConNguoi
{
    //Khai báo hàm khởi tạo
    public function __construct()
    {
        echo 'Class ConNguoi';
    }
}

//Khởi tạo class ConNguoi
$connguoi = new ConNguoi();
//Kết Quả: Class ConNguoi

+Như các bạn đã thấy thì hàm __autoload() không được gọi khi chúng ta khởi tạo class được xác định. Giờ mình thử xóa bỏ đoạn khai báo class ConNguoi nhưng vẫn khởi tạo nó xem sao.

<?php

//Khai báo hàm __autoload
function __autoload($className)
{
    echo 'Bạn vừa khởi tạo class: ' . $className;
}

//Khởi tạo class ConNguoi
$connguoi = new ConNguoi();
//Kết Quả:
//Bạn vừa khởi tạo class: ConNguoi
// Fatal error: Class 'ConNguoi' not found

-Oh, Vậy là hàm __autoload() đã được gọi. Như vậy câu nói trên là đúng nhé!

2, Các Ví Dụ.

-Vì hàm __autoload() sẽ tự động được gọi khi chúng ta khởi tạo một đối tượng không xác định được, nên nó được ứng dụng vào việc tạo ra các ứng dụng autoloading classes.

Autoload class thông thường.

VD1: Chúng ta có 3 file NguoiLon.php, TreCon.phpindex.php ở cùng cấp thư mục.

+File NguoiLon.php, chứa class NguoiLon có nội dung như sau:

<?php 
class NguoiLon
{
	public function __construct()
	{
		echo 'Class NguoiLon';
	}
}

+File TreCon.php, chứa class TreCon có nội dung như sau:

<?php 
class TreCon
{
	public function __construct()
	{
		echo 'Class TreCon';
	}
}

+Thông thường, để khởi tạo 2 class trên trong file index.php thì chúng ta phải include từng file class như sau:

<?php 
//Nhúng file ConNguoi
include_once 'NguoiLon.php';
//Nhúng file ConNguoi
include_once 'TreCon.php';

//Khởi tạo 2 class
$nguoilon = new NguoiLon();
//Kết Quả: Class NguoiLon
$trecon = new TreCon();
//Kết Quả: Class TreCon

+Nhưng nếu chúng ta sử dụng  hàm __autoload() thì sẽ chỉ phải khai báo ngắn gọn như sau:

<?php 
//khai báo hàm __autoload
function __autoload($className)
{
    //kiểm tra xem file tồn tại không
    if(file_exists($className . '.php')){
        //Nếu tồn tại thì nhúng file vào.
        include_once $className . '.php';
    }
}
//Khởi tạo 2 class
$nguoilon = new NguoiLon();
//Kết Quả: Class NguoiLon
$trecon = new TreCon();
//Kết Quả: Class TreCon

Autoload khi gọi phương thức tĩnh.

-Và hàm __autoload() này cũng được gọi khi chúng ta gọi phương thức tĩnh không xác định.

VD: Chúng ta có 2 file ConNguoi.php và một file index.php ở cùng thư mục.

+File ConNguoi.php, chứa class ConNguoi có nội dung như sau:

<?php 

class ConNguoi
{
    private static $name = 'ConNguoi';

    public function __construct()
    {
        
    }

    public static function getName()
    {
    	echo static::$name;
    }

}

+File index.php, có nội dung như sau:

<?php 

//khai báo hàm __autoload
function __autoload($className)
{
    //kiểm tra xem file tồn tại không
    if(file_exists($className . '.php')){
        //Nếu tồn tại thì nhúng file vào.
        include_once $className . '.php';
    }
}

ConNguoi::getName();
//Kết Quả: ConNguoi

-Sau khi chạy file index.php thì như các bạn cũng đã thấy là nó vẫn chạy bình thường.

3, Lời kết.

-Như vậy mình đã giới thiệu xong đến các bạn về hàm __autoload() trong PHP rồi, theo như thống kê, nếu chúng ta sử dụng nhiều hơn 1 lần include (require) thì dùng __autoload() sẽ nhanh hơn, còn nếu chỉ include (require) 1 lần thì __autoload() chậm hơn 1 tí nhưng không đáng kể. Bài tiếp theo chúng ta sẽ tìm hiểu về 2 magic methods __set()__get() trong PHP.

Nguồn: Toidicode.com

Thông tin tác giả

Vũ Thanh Tài

Vũ Thanh Tài

Biển học vô biên, quay đầu là dại!

Hãy tham gia group facebook để cùng giao lưu chia sẻ kiến thức! Tham Gia