# PHP Autoloading (ok)

### Tạo autoloader riêng

Để hiểu rõ cơ chế autoloading, chúng ta sẽ cùng nhau thử tạo ra một autoloader riêng. Bắt đầu bằng một ví dụ mà chúng ta thường viết kiểu này trước đây: Chúng ta có hai Class A và B ở hai file khác nhau A.php và B.php

```
<?php
// Classes/A.php
class A {}
```

và

```
<?php
// Classes/B.php
class B {}
```

Trong một file PHP chúng ta muốn gọi đến các Class A và B thì chúng ta phải thực hiện include các class này vào:

```
<?php
// index.php
include_once 'Classes/A.php';
include_once 'Classes/B.php';
// load A class
$a = new A();
// check the list of all loaded files
var_dump(get_included_files());
```

Kết quả khi chạy index.php như sau:

```
array(3) { 
    [0]=> string(35) "C:\Laragon\www\autoloader\index.php" 
    [1]=> string(39) "C:\Laragon\www\autoloader\Classes\A.php" 
    [2]=> string(39) "C:\Laragon\www\autoloader\Classes\B.php" 
}
```

Như vậy, toàn bộ các class được include vào index.php. Nếu chúng ta chỉ có 2 Class A và B thì không có vấn đề gì cả, khi số lượng class lên đến hàng 100 thậm chí hàng 1000, những ứng dụng hiện đại sử dụng các gói thư viện ngoài có khi lên đến cả triệu class thì cách thức viết code như vậy sẽ không thể thực hiện được, chúng ta cần đến autoloader. Cùng xem cách thức autoloading thực hiện bởi autoloader đơn giản sau:

```
<?php
// index.php
function my_autoloader($class) {
  include 'Classes/' . $class . '.php';
}
// register the autoloader
spl_autoload_register('my_autoloader');
// load A class
$b = new A();
// check the list of all loaded files
var_dump(get_included_files());
```

Như vậy trong function my\_autoloader() chúng ta đã thực hiện việc ánh xạ giữa tên class và đường dẫn đến class để thực hiện include class này. Kết quả như sau:

```
array(2) { 
    [0]=> string(35) "C:\Laragon\www\autoloader\index.php" 
    [1]=> string(39) "C:\Laragon\www\autoloader\Classes\A.php" 
}
```

Như vậy chỉ có class nào cần gọi đến thì mới được include vào. Cách ánh xạ này đã giúp chúng ta có thể autoloading tuy còn một số nhược điểm như sau:

* Tên file phải trùng tên với tên class.
* Mỗi file chỉ được chứa duy nhất một class.
* Tên file và tên class là phân biệt chữ hoa chữ thường.

Những tình huống này được xử lý trong autoloader của công cụ composer.
