Tự động tải php hoạt động như thế nào?

Chúc các bạn một ngày tốt lành. Trong bài đăng này, chúng ta sẽ xem cách giải câu đố lập trình Php Autoload Classes

There is not just one way to solve a problem; rather, there are many different ways that can be tried. Php Autoload Classes Further down, we will go over the remaining potential solutions.

The introduction of spl_autoload_register() gave programmers 
the ability to create an autoload chain, 
a series of functions that can be called to try and load a class or interface. 
For example:

Nhiều ví dụ thực tế minh họa cách xử lý sự cố Php Autoload Classes

Lớp tự động tải trong PHP là gì?

Hàm spl_autoload_register() đăng ký bất kỳ số lượng trình tải tự động nào, cho phép các lớp và giao diện được tải tự động nếu chúng hiện chưa được xác định. Bằng cách đăng ký trình tải tự động, PHP có cơ hội cuối cùng để tải lớp hoặc giao diện trước khi lỗi xảy ra

Các lớp được tải trong PHP như thế nào?

Các lớp tải PHP được sử dụng để khai báo đối tượng của nó, v.v. trong các ứng dụng hướng đối tượng. Trình phân tích cú pháp PHP tải nó tự động, nếu nó được đăng ký với chức năng spl_autoload_register(). 31-Mar-2022

Tự động tải PHP hoạt động như thế nào?

Trình tải tự động PHP tìm kiếm đệ quy trong các thư mục được xác định cho các định nghĩa lớp, đặc điểm và giao diện. Nếu không có bất kỳ cấu hình nào nữa, thư mục chứa tệp yêu cầu sẽ được sử dụng làm đường dẫn lớp mặc định. Tên tệp không cần tuân theo bất kỳ quy ước nào. Tất cả các tệp được tìm kiếm cho các định nghĩa lớp. 16-Tháng chín-2012

Cách tự động tải lớp PHP theo cách của nhà soạn nhạc?

Sau khi bạn tạo nhà soạn nhạc. json trong thư mục gốc của dự án với nội dung như 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 nhà cung cấp. Cuối cùng, bạn cần bao gồm yêu cầu 'nhà cung cấp/tự động tải. 19-Aug-2020

__ TRỰC TIẾP __ trong PHP là gì?

__DIR__ có thể được sử dụng để lấy thư mục làm việc của mã hiện tại. Nó đã được giới thiệu trong PHP bắt đầu từ phiên bản 5. 3. Nó tương tự như sử dụng dirname(__FILE__). Thông thường, nó được sử dụng để bao gồm các tệp khác có trong một tệp được bao gồm. 06-Apr-2020

zsh autoload là gì?

Lệnh autoload về cơ bản hướng dẫn Zsh đăng ký một chức năng (được gọi là đồng hồ) bằng cách sử dụng nội dung của tệp đồng hồ nằm trong một thư mục ở đâu đó dọc theo fpath. # dưới cùng của. tệp zshrc fpath=( ~/. zshfn "${fpath[@]}" ) tự động tải -Uz đồng hồ. 24-May-2020

ReflectionClass là gì?

lớp học phản chiếu. Hàm getProperties() là một hàm sẵn có trong PHP được sử dụng để trả về một mảng các thuộc tính được phản ánh. 30-Nov-2019

Tự động tải trong laravel là gì?

Tự động tải cho phép bạn tải các tệp lớp khi cần mà không cần tải hoặc thêm chúng một cách rõ ràng. Điều này giúp bạn dễ dàng chạy ứng dụng của mình bằng cách tự động tải các tệp cần thiết mọi lúc. Laravel được xây dựng để hoạt động với Composer. 27-Apr-2015

Sự khác biệt giữa yêu cầu và bao gồm trong PHP là gì?

Sử dụng yêu cầu khi ứng dụng yêu cầu tệp. Sử dụng bao gồm khi tệp không được yêu cầu và ứng dụng sẽ tiếp tục khi không tìm thấy tệp

Tệp tự động tải của nhà soạn nhạc là gì?

Tự động tải có nghĩa là tự động tải các tệp cần thiết cho dự án/ứng dụng của bạn. Đó là bao gồm các tệp cần thiết cho ứng dụng của bạn mà không bao gồm nó một cách rõ ràng bằng các hàm include() hoặc require(). 26-Apr-2020

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
2

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
3

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
4

Trình soạn thảo là công cụ tuyệt vời nhất dành cho bất kỳ nhà phát triển PHP nào giúp quản lý các phụ thuộc cho bất kỳ gói ứng dụng nào không gặp rắc rối

Trong các phần tiếp theo, tôi sẽ không nói về chức năng chính của trình soạn thảo - đó là quản lý các phụ thuộc - và tôi sẽ tập trung vào cách các ứng dụng quản lý việc tải một số lượng lớn các gói bằng trình soạn thảo

  1. Tự động tải là gì
  2. Hãy để chúng tôi tạo Autoloader của chúng tôi
  3. Trình soạn thảo tự động tải như thế nào
  4. Sơ đồ lớp so với. PSR-0 so với. PSR-4
  5. Sự kết luận
  6. Người giới thiệu

1. Tự động tải là gì

Một trong những điều khó chịu nhất là phải viết một danh sách dài những thứ cần thiết bao gồm ở đầu mỗi tập lệnh

Vấn đề. Giả sử rằng bạn đang phát triển một ứng dụng và bạn có một danh sách dài các thư viện cần tải

Dung dịch. Tải tất cả các lớp vào đầu tập lệnh của bạn và bạn sẽ có thể sử dụng bất kỳ lớp nào trong số này ở bất kỳ đâu trong ứng dụng của mình

Giải pháp tốt hơn. Bất cứ khi nào tôi sử dụng một lớp, tôi sẽ tải nó, vì vậy ứng dụng của tôi không phải tải tất cả các lớp theo từng yêu cầu, điều này được gọi là “Tự động tải”. Nhưng làm thế nào để đạt được điều đó?… hãy cùng chúng tôi tìm hiểu

2. Hãy để chúng tôi tạo Autoloader của chúng tôi

Giải pháp đơn giản nhất, chúng tôi bao gồm tất cả các tệp

// Classes/A.php
class A {}
// Classes/B.php
class B {}
// 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());

Tập lệnh

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
2 sẽ xuất ra

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}

Điều đó có nghĩa là chúng tôi đã tải tất cả các tệp cho dù chúng tôi có sử dụng lớp

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
3 hay không và miễn là dự án của bạn ngày càng lớn hơn, thì cách này sẽ không hiệu quả

Ở đây có Autoloading để giải quyết vấn đề

// index.php// my custom autoloader
function my_autoloader($class) {
include 'Classes/' . $class . '.php';
}

// register the autoloader
spl_autoload_register('my_autoloader');

// load A class
$a = new A();

// check the list of all loaded files
var_dump(get_included_files());

Bạn viết theo cách bạn thực hiện "ánh xạ" giữa tên lớp và đường dẫn tệp của nó trong hàm

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
4 và đăng ký nó trong tập lệnh của bạn để bạn nói với tập lệnh của mình rằng bất cứ khi nào bạn khởi tạo một lớp, chỉ cần tìm kiếm nó thông qua hàm này và tải nó. Bây giờ, hãy kiểm tra số lượng tệp được tải trong tập lệnh của bạn

array(2) {
[0]=> string(50) "/path/to/demos/autoload-2/index.php"
[1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
}

Bây giờ, tập lệnh của bạn tải các tệp mà nó chỉ cần

PHP đang nói với bạn “Tôi sẽ cho bạn cơ hội để tải lớp của bạn ngay cả khi bạn không tải nó trước câu lệnh của bạn

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
5 sau đó, tôi sẽ báo lỗi nếu nó không hoạt động”

Ví dụ trước hoạt động tốt, nhưng bạn phải xem xét những điều sau đây

  1. Tên tệp phải có cùng tên lớp
  2. Mỗi tệp đơn lẻ chỉ nên có một lớp
  3. Độ nhạy trong tên lớp và tên tệp

Bạn có thể xử lý tất cả các tình huống này bằng cách triển khai của riêng mình và bất kỳ ứng dụng nào cũng có thể thực hiện ánh xạ riêng dựa trên cấu trúc tệp của nó, nhưng để sử dụng trình tải tự động này, bạn phải tuân theo các cân nhắc trước đó

Trình soạn thảo đưa ra một cách phù hợp với hầu hết các cấu trúc (hoặc bạn có thể nói rằng nó buộc các ứng dụng phải lựa chọn giữa), chúng ta hãy tìm hiểu sâu hơn một chút về nó

3. Trình soạn thảo tự động tải như thế nào

Cùng với kịch bản của bạn

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
2, hãy thêm
array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
7 của bạn

// Classes/A.php
class A {}
// Classes/B.php
class B {}
// 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());
1

Và cập nhật chỉ mục của bạn. tập tin php để

// Classes/A.php
class A {}
// Classes/B.php
class B {}
// 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());
2

Sử dụng

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
8, chúng tôi đang nói với nhà soạn nhạc rằng đây là cách để lập bản đồ và đó là cách rất cơ bản để ánh xạ không gian tên tới đường dẫn và nếu bạn muốn biết thêm chi tiết, chỉ cần kiểm tra
array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
9 sau khi bạn chạy
// index.php// my custom autoloader
function my_autoloader($class) {
include 'Classes/' . $class . '.php';
}

// register the autoloader
spl_autoload_register('my_autoloader');

// load A class
$a = new A();

// check the list of all loaded files
var_dump(get_included_files());
0

// Classes/A.php
class A {}
// Classes/B.php
class B {}
// 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());
6

Và bất cứ khi nào bạn khởi tạo lớp

// index.php// my custom autoloader
function my_autoloader($class) {
include 'Classes/' . $class . '.php';
}

// register the autoloader
spl_autoload_register('my_autoloader');

// load A class
$a = new A();

// check the list of all loaded files
var_dump(get_included_files());
1, nó sẽ tải tệp
// index.php// my custom autoloader
function my_autoloader($class) {
include 'Classes/' . $class . '.php';
}

// register the autoloader
spl_autoload_register('my_autoloader');

// load A class
$a = new A();

// check the list of all loaded files
var_dump(get_included_files());
2

Dòng chảy rất dễ hiểu. Nó luôn bắt đầu từ dòng sau trong bộ điều khiển phía trước của bạn

// Classes/A.php
class A {}
// Classes/B.php
class B {}
// 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());
9

Và bạn sẽ nhận ra rằng

// index.php// my custom autoloader
function my_autoloader($class) {
include 'Classes/' . $class . '.php';
}

// register the autoloader
spl_autoload_register('my_autoloader');

// load A class
$a = new A();

// check the list of all loaded files
var_dump(get_included_files());
3 có tất cả logic, đó là thêm các ánh xạ khác nhau và cuối cùng, nó đang đăng ký trình tải tự động

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
1

Và đây là nơi chúng tôi đăng ký trình tải tự động của mình

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
2

Và bất cứ khi nào chúng tôi khởi tạo một lớp, nó sẽ chuyển đến

// index.php// my custom autoloader
function my_autoloader($class) {
include 'Classes/' . $class . '.php';
}

// register the autoloader
spl_autoload_register('my_autoloader');

// load A class
$a = new A();

// check the list of all loaded files
var_dump(get_included_files());
4 để tìm tệp tương ứng và tải nó

4. Sơ đồ lớp so với. PSR-0 so với. PSR-4

Tất cả chúng đều là những cách khác nhau để ánh xạ không gian tên với các đường dẫn tương ứng của chúng, khi bạn chọn một trong số chúng, bạn phải tuân theo quy tắc của chúng và cuối cùng, nhà soạn nhạc biết cách tìm và tải tệp dựa trên ánh xạ mà bạn đang theo dõi

a) Sơ đồ lớp. là đơn giản và dễ hiểu nhất, nó in logic trong

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
9, khi nhà soạn nhạc đọc rằng chúng tôi đang sử dụng tự động tải
array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
8, nó sẽ quét tất cả các tệp trong các thư mục được đề cập (trong tệp
array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
7) và tạo một mảng không gian tên và các đường dẫn tương ứng

Ghi chú. thêm các tệp mới yêu cầu

// index.php// my custom autoloader
function my_autoloader($class) {
include 'Classes/' . $class . '.php';
}

// register the autoloader
spl_autoload_register('my_autoloader');

// load A class
$a = new A();

// check the list of all loaded files
var_dump(get_included_files());
8 để tạo lại ánh xạ

b) PSR-0. logic tồn tại trong

// index.php// my custom autoloader
function my_autoloader($class) {
include 'Classes/' . $class . '.php';
}

// register the autoloader
spl_autoload_register('my_autoloader');

// load A class
$a = new A();

// check the list of all loaded files
var_dump(get_included_files());
9 và - từ tên của nó - nó tuân theo các quy tắc của PSR-0

c) PSR-4. logic tồn tại trong

array(2) {
[0]=> string(50) "/path/to/demos/autoload-2/index.php"
[1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
}
0 và - từ tên của nó - nó tuân theo các quy tắc của PSR-4

Cả PSR-0 và PSR-4 đều gần như có cùng quy tắc

Lưu ý những điều dưới đây

  • Đối với cả hai, bạn không phải chạy
    // index.php// my custom autoloader
    function my_autoloader($class) {
    include 'Classes/' . $class . '.php';
    }

    // register the autoloader
    spl_autoload_register('my_autoloader');

    // load A class
    $a = new A();

    // check the list of all loaded files
    var_dump(get_included_files());
    8 mỗi khi bạn thêm một lớp PHP mới vì quá trình "tìm kiếm đường dẫn tệp" đang diễn ra linh hoạt
  • Bạn phải sử dụng không gian tên, đặc biệt là với PSR-4 vì không gian tên được đính kèm với đường dẫn tệp

Tên thư mục con PHẢI khớp với trường hợp của tên không gian tên phụ. -PSR-4

  • PSR-0 chuyển đổi dấu gạch dưới thành dấu tách thư mục và nó không có trong PSR-4

Mỗi ký tự

array(2) {
[0]=> string(50) "/path/to/demos/autoload-2/index.php"
[1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
}
2 trong TÊN LỚP được chuyển đổi thành
array(2) {
[0]=> string(50) "/path/to/demos/autoload-2/index.php"
[1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
}
3. Ký tự
array(2) {
[0]=> string(50) "/path/to/demos/autoload-2/index.php"
[1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
}
2 không có ý nghĩa đặc biệt trong
không gian tên. -PSR-0

Vì vậy,

array(2) {
[0]=> string(50) "/path/to/demos/autoload-2/index.php"
[1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
}
5 sẽ tải tệp sau

array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
0

Lưu ý ở đây, chúng tôi không sử dụng không gian tên

  • array(3) {
    [0]=> string(20) "/path/to/root/index.php"
    [1]=> string(24) "/path/to/root/Classes/A.php"
    [2]=> string(24) "/path/to/root/Classes/B.php"
    }
    7 sau đang hoạt động như mong đợi và bất kỳ tiền tố không gian tên nào
    array(2) {
    [0]=> string(50) "/path/to/demos/autoload-2/index.php"
    [1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
    }
    7 sẽ tìm tệp bên trong thư mục
    array(2) {
    [0]=> string(50) "/path/to/demos/autoload-2/index.php"
    [1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
    }
    8, nhưng với
    array(2) {
    [0]=> string(50) "/path/to/demos/autoload-2/index.php"
    [1]=> string(54) "/path/to/demos/autoload-2/Classes/A.php"
    }
    9, bạn sẽ thấy nó khó hiểu và sẽ không hoạt động như mong đợi
array(3) {
[0]=> string(20) "/path/to/root/index.php"
[1]=> string(24) "/path/to/root/Classes/A.php"
[2]=> string(24) "/path/to/root/Classes/B.php"
}
1

5. Sự kết luận

Chúng tôi đã bắt đầu xác định Tự động tải trong PHP và vấn đề mà nó đang giải quyết, sau đó, chúng tôi đã xây dựng một vấn đề đơn giản và cuối cùng, chúng tôi đã chuyển sang nói về trình soạn thảo và cách nó thực hiện ánh xạ theo những cách khác nhau

Lý do chính mà tôi đã giới thiệu chủ đề này là chúng tôi đang sử dụng trình soạn nhạc trong hầu hết các ứng dụng và gói của chúng tôi và chúng tôi phải hiểu cách thức hoạt động của phần

// Classes/A.php
class A {}
// Classes/B.php
class B {}
// 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());
10

Tôi đã cố gắng làm cho nó đơn giản nhất có thể, bạn có thể tiếp tục với các liên kết bên dưới và nếu bạn có bất kỳ câu hỏi nào, chỉ cần để lại trong phần nhận xét

Trình soạn thảo PHP tự động tải là gì?

Composer là trình quản lý phụ thuộc cấp ứng dụng cho PHP . Tính phụ thuộc đơn giản có nghĩa là các thư viện/gói mà ứng dụng của bạn phụ thuộc vào. Ngoài việc quản lý các phụ thuộc, trình soạn thảo cũng sẽ tự động tải các tệp cần thiết cho ứng dụng.

Tự động tải PHP ở đâu?

Tự động tải. php được trình soạn thảo tự động tạo khi các phụ thuộc được cài đặt hoặc cập nhật. Sau khi chạy trình soạn thảo cài đặt trong thư mục gốc của dự án, bạn sẽ tìm thấy thư mục nhà cung cấp/ chứa các phần phụ thuộc và trình tải tự động .

Tự động tải PHP trong laravel là gì?

Tự động tải cho phép bạn tải các tệp lớp khi cần mà không cần tải hoặc bao gồm chúng một cách rõ ràng . Điều này giúp bạn dễ dàng chạy ứng dụng của mình bằng cách tự động tải các tệp cần thiết mọi lúc. Laravel được xây dựng để hoạt động với Composer.

Hàm ma thuật và Tự động tải trong PHP là gì?

PHP 5 đã giới thiệu chức năng kỳ diệu __autoload() được tự động gọi khi mã của bạn tham chiếu đến một lớp hoặc giao diện chưa được tải. This provides the runtime one last chance to load the definition before PHP fails with an error.