2012-09-25 61 views
5

Khi có một chức năng mà đòi hỏi một số thông số để được thông qua, chẳng hạn như bảy thông số, đó là thực hành tốt hơn:Truyền mảng tham số so với tham số riêng lẻ cho một hàm trong PHP?

function foo($par1, $par2, $par3, $par4, $par5, $par6, $par7) 
{ 
} 

hoặc

function foo(array $args) 
{ 
} 

đâu trong ví dụ thứ hai $args sẽ một mảng với các tham số như là các phần tử.

Tôi đã không nhất quán sử dụng cả hai phương pháp.

Điểm bất lợi khi sử dụng phương pháp thứ nhất là nếu bạn nhận được thứ tự tham số sai, bạn đã bị hỏng (và có thể khó gỡ lỗi vì nó không phải lúc nào cũng rõ ràng). Đây là lợi thế của việc sử dụng phương thức mảng.

Lợi thế (IMHO) của việc sử dụng kiểu đầu tiên là một trình soạn thảo PHP tốt như PhpStorm sẽ hiển thị cho bạn tên của các tham số khi bạn đang gõ hàm, dễ hơn là đi đến hàm để xem tham số nào cần được truyền trong một mảng.

Đánh giá cao lời khuyên của bạn.

+0

điều gì đã hiệu quả với bạn trong bối cảnh dự án. –

+0

Nếu bạn có một hàm với 7 tham số, nó có thể có quá nhiều trách nhiệm. –

Trả lời

4

Về mặt lý thuyết, mỗi thông số phải bao gồm toàn bộ logic. Bộ sưu tập có nghĩa là đại diện cho một tập hợp các giá trị, không phải là tổng hợp các tham số phương thức; các thông số riêng lẻ phải được truyền riêng để chỉ rõ mục đích của phương pháp.

Thực tế, khi chuyển các tham số trong một mảng, bạn phải thực hiện một tấn kiểm tra thủ công để đảm bảo thông số chính xác đã được thông qua. Bạn có thể tránh được rất nhiều sự mơ hồ bằng cách đưa ra các tham số của bạn rõ ràng, tên hợp lý (và các kiểu gõ nếu có thể). Ngoài ra, như một bình luận đã được nêu, nếu một phương pháp có 7 tham số, nó có thể chín muồi cho một số tái cấu trúc.

Edit: nếu phương pháp của bạn/chức năng không chấp nhận một bộ mơ hồ định nghĩa "lựa chọn" có ảnh hưởng đến những gì các mã không chỉ theo một cách đáng kể, xem xét sử dụng các thành phần Symfony OptionsResolver, để giảm bớt đáng kể xác nhận lựa chọn của bạn mảng.

0

Nếu bạn có nhiều tùy chọn dựa trên các đối số hoặc muốn linh hoạt hơn, hãy thử func_get_args().

function foo() 
{ 
    $arg_list = func_get_args(); 
    for ($i = 0; $i < $numargs; $i++) { 
     echo "Argument $i is: " . $arg_list[$i] . "<br />\n"; 
    } 
} 

Nếu bạn muốn thu hẹp đối số được chấp nhận thì xác định biến là tốt nhất.

1

Tôi nghĩ câu hỏi này sẽ tóm tắt thành "Cách gõ mạnh mẽ là php?" hoặc "Tôi đã nhập công cụ của mình như thế nào?"

Rõ ràng, mảng được ghép nối lỏng lẻo nhất. Số lượng các biến và tên của chúng được hoàn thành cho người gọi.

Cuộc gọi của bạn với các tham số riêng biệt được kết hợp mạnh hơn một chút, vì vậy phải có ít nhất số lượng tham số được cung cấp.

IMHO bạn đã quên một loại cuộc gọi và đó là với type hinting. Đó là cách mạnh nhất để gõ mạnh mẽ php, tại thời điểm này, cung cấp.

dụ:

function foo(\MyNamespace\MyObject $par1, \YourNamespace\YourObject $par2) 
{ 
} 

Ý kiến ​​của tôi: với nền của tôi bằng các ngôn ngữ chỉ mạnh mẽ đánh máy, tôi thích gõ mạnh typed hinting. Có tin đồn rằng php 5.5 hoặc php 6 cũng sẽ hỗ trợ vô hướng như một gợi ý kiểu.

Các vấn đề liên quan