CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này phân tích việc triển khai tính năng tự động tải của trình soạn thảo trong framework Laravel do tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.
Căn cứ.
Tự động tải cho phép bạn tải các tệp lớp được yêu cầu bằng cách tải chúng ra khỏi hộp mà không cần phải viết các câu lệnh require và include rườm rà mỗi lần. Do đó, chỉ những lớp cần thiết mới được tải trong quá trình thực hiện từng yêu cầu và bạn không cần lo lắng về việc tải các lớp mà chỉ cần sử dụng chúng trực tiếp khi cần.
Khung laravel được tải tự động thông qua trình soạn thảo.
Điều này đạt được thông qua đoạn mã sau.
?
1
2
|
yêu cầu_một_lần
__CỦA BẠN__ .
'/ nhà soạn nhạc'
.
'/autoload_real.php'
;
trở lại
ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f::getLoader();
|
Đầu tiên, hãy giải thích hai hàm spl_autoload_register và spl_autoload_unregister.
spl_autoload_register tự động đăng ký một hoặc nhiều hàm tự động tải, thường chạy tự động khi một lớp được khởi tạo.
spl_autoload_unregister thực hiện hoàn toàn ngược lại.
Dán mã thử nghiệm của tôi:
Đây là autoload.php.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
không gian tên
ứng dụng;
lớp học
Tự động tải {
công cộng
chức năng
__xây dựng()
{
$cái này
->tự động tải();
}
công cộng
chức năng
tự động tải(){
spl_tự_động_tải_đăng_ký(
mảng
(
'ứng dụng\Tự động tải'
,
'ss'
),ĐÚNG VẬY);
}
công cộng
chức năng
ss(){
tiếng vọng
666;
ra
;
}
}
|
Đây là chỉ mục.php.
?
1
2
3
4
5
6
7
8
9
10
11
12
|
yêu cầu
'tự động tải.php'
;
$tự động tải
=
mới
\app\Tự động tải();
$b
=
mới
B();
tiếng vọng
77;
ra
;
|
Tìm hàm getLoader và phân tích nó:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
công cộng
tĩnh
chức năng
lấy Bộ nạp()
{
nếu như
(null !== tự::
$bộ nạp
) {
trở lại
bản thân::
$bộ nạp
;
}
spl_tự_động_tải_đăng_ký(
mảng
(
'ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f'
,
'loadClassLoader'
), đúng, đúng);
bản thân::
$bộ nạp
=
$bộ nạp
=
mới
\Composer\Autoload\ClassLoader();
spl_autoload_hủy đăng ký(
mảng
(
'ComposerAutoloaderInit7b20e4d61e2f88170fbbc44c70d38a1f'
,
'loadClassLoader'
));
/********************* 1**************************** ****************************
$bản đồ
=
yêu cầu
__CỦA BẠN__ .
'/autoload_namespaces.php'
;
foreach
(
$bản đồ
BẰNG
$không gian tên
=>
$đường dẫn
) {
$bộ nạp
->đặt(
$không gian tên
,
$đường dẫn
);
}
$bản đồ
=
yêu cầu
__CỦA BẠN__ .
'/autoload_psr4.php'
;
foreach
(
$bản đồ
BẰNG
$không gian tên
=>
$đường dẫn
) {
$bộ nạp
->đặtPsr4(
$không gian tên
,
$đường dẫn
);
}
$classBản đồ
=
yêu cầu
__CỦA BẠN__ .
'/autoload_classmap.php'
;
nếu như
(
$classBản đồ
) {
$bộ nạp
->thêmClassMap(
$classBản đồ
);
}
/********************* 1**************************** ****************************
$bộ nạp
->register(đúng);
$includeFiles
=
yêu cầu
__CỦA BẠN__ .
'/autoload_files.php'
;
foreach
(
$includeFiles
BẰNG
$fileIdentifier
=>
$tập tin
) { nhà soạn nhạcYêu cầu7b20e4d61e2f88170fbbc44c70d38a1f(
$fileIdentifier
,
$tập tin
); }
trở lại
$bộ nạp
; }}
|
Phần được bao quanh bởi /***** chủ yếu dành cho ClassLoader.
$prefixesPsr0, $prefixDirsPsr4, $classMap và các thuộc tính khác được gán giá trị. Nghĩa là, một số tệp được định cấu hình sẽ được tải và khi tải hoặc tìm kiếm tệp sau này, chúng sẽ được tìm kiếm từ các tệp cấu hình đã tải. Việc tìm lớp cần tải chủ yếu được thực hiện thông qua chức năng đăng ký. Sau đó phân tích chức năng đăng ký.
?
1
2
3
4
|
công cộng
chức năng
đăng ký(
$thêm vào trước
= sai)
{
spl_tự_động_tải_đăng_ký(
mảng
(
$cái này
,
'tảiLớp'
), ĐÚNG VẬY,
$thêm vào trước
);
}
|
Người ta thấy rằng hàm LoadClass trong lớp này thực sự được đăng ký là hàm tải tự động. Vì vậy, tôi bắt đầu phân tích hàm LoadClass và cuối cùng tìm kiếm các lớp thông qua findFile.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
công cộng
chức năng
tìmTệp(
$lớp học
)
{
nếu như
(
'\\'
==
$lớp học
[0]) {
$lớp học
=
chất nền
(
$lớp học
, 1);
}
nếu như
(không có gì cả)
$cái này
->Bản đồ lớp[
$lớp học
])) {
trở lại
$cái này
->Bản đồ lớp[
$lớp học
];
}
nếu như
(
$cái này
->classMapAuthoritative) {
trở lại
SAI;
}
$tập tin
=
$cái này
->tìmTệpVớiPhầnMởRộng(
$lớp học
,
'.php'
);
nếu như
(
$tập tin
=== null && được định nghĩa(
'Phiên bản HHVM'
)) {
$tập tin
=
$cái này
->tìmTệpVớiPhầnMởRộng(
$lớp học
,
'.hh'
);
}
nếu như
(
$tập tin
=== không có) {
trở lại
$cái này
->Bản đồ lớp[
$lớp học
] = sai;
}
trở lại
$tập tin
;
}
|
Tại thời điểm này, việc phân tích chức năng đăng ký được hoàn thành. Sau đó, chúng tôi phân tích mã còn lại của hàm getLoader.
?
1
2
3
4
|
$includeFiles
=
yêu cầu
__CỦA BẠN__ .
'/autoload_files.php'
;
foreach
(
$includeFiles
BẰNG
$fileIdentifier
=>
$tập tin
) {
nhà soạn nhạcYêu cầu7b20e4d61e2f88170fbbc44c70d38a1f(
$fileIdentifier
,
$tập tin
);
}
|
Mã này thực sự tải tệp autoload_file.php.
Tóm tắt.
Trên đây là toàn bộ nội dung bài viết mong rằng nội dung bài viết có giá trị tham khảo nhất định cho quá trình học tập, làm việc của mọi người. Nếu có thắc mắc gì có thể để lại tin nhắn để trao đổi.
Liên kết gốc: http://blog.csdn.net/qq_16877261/article/details/77707453.
Cuối cùng, bài viết này về phân tích triển khai tải tự động của trình soạn thảo trong khung Laravel kết thúc ở đây. Nếu bạn muốn biết thêm về phân tích triển khai tải tự động của trình soạn thảo trong khung Laravel, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. mong mọi người sẽ ủng hộ blog của mình trong tương lai nhé! .
Tôi là một lập trình viên xuất sắc, rất giỏi!