Closure và 'use'
Thuộc phần Logic và luồng chương trình trong hành trình PHP của Coddy. Bài học 2 trên 68.
Theo mặc định, các hàm ẩn danh chỉ có thể truy cập những biến được truyền vào làm tham số. Nhưng nếu bạn cần bao đóng truy cập một biến trong phạm vi bên ngoài thì sao? Đây là lúc từ khóa use phát huy tác dụng.
Từ khóa use cho phép hàm đóng (closure) “bắt” các biến từ phạm vi cha và sử dụng chúng bên trong hàm:
<?php
$message = "Welcome";
$greeting = function($name) use ($message) {
echo $message . ", " . $name . "!";
};
$greeting("Bob"); // In ra: Welcome, Bob!
?>Lưu ý rằng $message được định nghĩa bên ngoài hàm, nhưng khi thêm use ($message) sau danh sách tham số, hàm đóng có thể truy cập và sử dụng biến đó. Bạn có thể thu nhận nhiều biến bằng cách phân tách chúng bằng dấu phẩy: use ($var1, $var2).
Tính năng này giúp closure trở nên mạnh mẽ hơn nhiều, cho phép chúng làm việc với dữ liệu từ ngữ cảnh xung quanh mà vẫn giữ được tính linh hoạt của hàm ẩn danh.
Thử thách
DễTạo một hàm ẩn danh nắm bắt phần trăm giảm giá từ phạm vi bên ngoài bằng từ khóa use. Hàm nhận giá làm tham số và trả về giá cuối cùng sau khi áp dụng mức giảm giá.
Bạn sẽ nhận được hai đầu vào: phần trăm giảm giá và giá gốc. Đọc cả hai đầu vào, tạo một closure nắm bắt phần trăm giảm giá, gọi closure với giá rồi in ra giá cuối cùng sau khi giảm giá.
Định dạng đầu vào: Hai dòng, dòng đầu tiên chứa phần trăm giảm giá (một số), dòng thứ hai chứa giá gốc (một số có thể có phần thập phân)
Đầu ra mong đợi: Giá cuối cùng sau khi áp dụng mức giảm giá
Tự làm thử
<?php
// Đọc các giá trị đầu vào (input)
$discount = floatval(fgets(STDIN));
$price = floatval(fgets(STDIN));
// TODO: Tạo hàm (function) ẩn danh dùng 'use' để lấy phần trăm giảm giá
// Hàm cần nhận tham số (parameter) giá và trả về giá cuối cùng sau khi giảm
// TODO: Gọi hàm đóng (closure) với giá và lưu kết quả
// In ra giá cuối cùng
echo $finalPrice;
?>Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng chương trình
1Hàm nâng cao
Hàm ẩn danhClosure và 'use'Hàm mũi tênHàm callbackDùng 'call_user_func'Hàm biếnTruyền tham chiếuHàm đệ quyÔn tập: tổng hợp về hàm4Mảng đa chiều
Tạo mảng 2 chiềuTruy cập phần tử trong mảng 2 chiềuChỉnh sửa phần tử trong mảng 2 chiềuLặp qua các vòng lặp lồng nhauMảng kết hợp 2 chiềuÔn tập: bài tập lưới đơn giản2Thao tác nâng cao với mảng
Thêm phần tử bằng 'array_push'Xóa phần tử bằng 'array_pop'Thêm phần tử vào đầu mảng bằng 'array_unshift'Xóa phần tử đầu mảng bằng 'array_shift'Gộp các mảng được đánh chỉ sốGộp các mảng kết hợpTrích xuất phần tử bằng 'array_slice'Kiểm tra giá trị bằng 'in_array'Tìm khóa bằng 'array_search'Ôn tập: bài tập về danh sách phát3Sắp xếp mảng
Sắp xếp mảng có chỉ số tăng dầnSắp xếp mảng có chỉ số giảm dầnSắp xếp mảng kết hợp theo giá trịSắp xếp mảng kết hợp theo khóaSắp xếp theo thứ tự tự nhiênSắp xếp tùy chỉnh bằng 'usort'Ôn tập: Sắp xếp bảng xếp hạngTự luyện tập: Trình biên dịch PHP online