2009-05-06 37 views
26

Xin chào, tôi đã làm việc với một hàm PHP lấy nhiều đối số và định dạng chúng. Hiện nay, tôi đang làm việc với một cái gì đó như thế này:PHP nhận tất cả đối số dưới dạng mảng?

function foo($a1 = null, $a2 = null, $a3 = null, $a4 = null){ 
    if ($a1 !== null) doSomethingWith($a1, 1); 
    if ($a2 !== null) doSomethingWith($a2, 2); 
    if ($a3 !== null) doSomethingWith($a3, 3); 
    if ($a4 !== null) doSomethingWith($a4, 4); 
} 

Nhưng tôi đã tự hỏi nếu tôi có thể sử dụng một giải pháp như thế này:

function foo(params $args){ 
    for ($i = 0; $i < count($args); $i++) 
     doSomethingWith($args[$i], $i + 1); 
} 

Nhưng vẫn gọi hàm theo cùng một cách, tương tự như từ khóa params trong C# hoặc mảng đối số trong JavaScript.

Trả lời

60

func_get_args trả về một mảng với tất cả đối số của hàm hiện tại.

+0

Một Gotcha với func_get_args đó là giá trị chỉ ra; bạn không thể chuyển nó vào một cuộc gọi hàm khác. – Rob

+4

@Rob Bạn có thể nếu bạn đi '$ args = func_get_args()' và sau đó 'call_user_func_array ($ func, $ args)' – alex

+1

func_get_args() chỉ trả về giá trị của các tham số đã được PASSED cho cuộc gọi hàm, không phải tất cả các tham số được xác định trong định nghĩa hàm. –

6

Hoặc như của PHP 7.1 bây giờ bạn có thể sử dụng một gợi ý kiểu gọi iterable

function f(iterable $args) { 
    foreach ($args as $arg) { 
     // awesome stuff 
    } 
} 

Ngoài ra, nó có thể được sử dụng thay vì Traversable khi bạn lặp lại bằng giao diện. Cũng như nó có thể được sử dụng như một máy phát điện mang lại các thông số.

Documentation

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