Tôi khuyên bạn nên sử dụng mảng kết hợp để chuyển các tham số có tên, nhưng giữ chúng trong mảng mà không cần giải nén chúng.
function myFunc(array $args) {
echo "Hi, " . $args['name'];
// etc
}
Có một vài lý do cho việc này. Nhìn vào hàm đó, bạn có thể thấy rõ ràng rằng tôi đang đề cập đến một trong các đối số được truyền vào hàm. Nếu bạn trích xuất chúng, và không nhận thấy extract()
bạn (hoặc anh chàng tiếp theo) sẽ có gãi đầu của bạn tự hỏi, nơi này "$name
" biến đến từ. Ngay cả khi bạn làm biết bạn đang trích xuất đối số cho biến cục bộ, đó vẫn là trò chơi đoán đến một mức độ nhất định.
Thứ hai, nó đảm bảo rằng mã khác không ghi đè các arg. Bạn có thể đã viết hàm của bạn chỉ mong muốn có đối số có tên là $foo
và $bar
, do đó, trong mã khác của bạn, bạn xác định $baz = 8;
, chẳng hạn. Sau đó, bạn có thể muốn mở rộng chức năng của mình để lấy thông số mới có tên "baz" nhưng quên thay đổi các biến khác của bạn, vì vậy bất kể thông tin nào được chuyển trong đối số, $baz
sẽ luôn được đặt thành 8.
Có là một số lợi ích cho sử dụng mảng quá (những áp dụng chung cho các phương pháp chiết xuất hoặc để lại trong mảng): bạn có thể thiết lập một biến ở phía trên cùng của mỗi chức năng gọi $defaults
:
function myFunc (array $args) {
$default = array(
"name" => "John Doe",
"age" => "30"
);
// overwrite all the defaults with the arguments
$args = array_merge($defaults, $args);
// you *could* extract($args) here if you want
echo "Name: " . $args['name'] . ", Age: " . $args['age'];
}
myFunc(array("age" => 25)); // "Name: John Doe, Age: 25"
bạn thậm chí có thể loại bỏ tất cả các mục từ $args
không có giá trị $default
tương ứng. Bằng cách này bạn biết chính xác biến nào bạn có.
Cách xử lý tốt nhất. Tôi rất tiếc khi không đọc câu trả lời của bạn trước khi viết. – Rolf