Bạn có 1 mảng chưa nhiều phần tử, ứng với tham số của 1 mảng, làm cách nào để truyền tham số dạng array vào function tự động ? Đọc bài viết này của tôi nhé.
Bạn sẽ thắc mắc khi nào sẽ cần dùng trường hợp này.
Khi cần đến trường hợp này là khi bạn cần thiết kế một function có thể truyền nhiều tham số, và function này cũng thay đổi theo từng thời điểm sử dụng, đồng thời chúng làm cùng 1 logic bạn không thể viết thêm 1 function khác chỉ để làm lại 1 việc tương tự.
Vì vậy bạn chỉ cần 1 hàm, thay đổi các tham số đầu vào để có thể linh động được các giá trị tham số của function.
Cách làm đơn giản bằng spread
Để truyền các giá trị trong một mảng vào các tham số của một hàm, bạn có thể sử dụng toán tử spread (hay còn gọi là spread syntax). Toán tử spread cho phép bạn mở rộng một mảng thành các giá trị riêng lẻ, từ đó bạn có thể truyền chúng vào các tham số của hàm.
Spread syntax trong php tưởng là không cần thiết, nhưng thật sự lại cần thiết không tưởng.
Bạn có functionA(a,b,c) và functionB(c,d,e,f,g,h) đề bài là bạn cần truyền tham số vào 2 function này thông qua 1 function khác, tạm gọi là Entity ví dụ ClassA::functionA, ClassB::functionB thông qua 1 function trung giam là Entity:function(name, params) thay vì bạn cần viết 2 lần Entity để có thể gọi riêng biệt đến 2 function ở 2 Object khác nhau, và nếu các tham số khác nhau bạn sẽ không có cách nào để truyền vào.
Thì lúc này spread syntax từ javascript được chuyển thể thành ReflectionMethod::invokeArgs sẽ là thức thuộc "hồi sinh" cho chương trình của bạn.
Khi đó bạn không cần biết functionA hay FunctionB kia có bao nhiêu tham số, chỉ cần truyền 1 array chứa tham số vào thông qua spread syntax, thì hệ thống sẽ tự hiểu và ép các tham số vào đúng vị trí của nó.
>> Xem thêm: Zalo mini app là gì? Lợi ích của zalo mini app với doanh nghiệp
Spread syntax trong php
Trong PHP, không có toán tử spread syntax như trong JavaScript. Tuy nhiên, từ phiên bản PHP 5.6 trở đi, bạn có thể sử dụng một số cú pháp khác để đạt được kết quả tương tự như toán tử spread.
Một trong những cách thông thường để truyền các giá trị từ một mảng vào các tham số của một hàm trong PHP là sử dụng các hàm như call_user_func_array()
hoặc ReflectionMethod::invokeArgs()
. Tuy nhiên, từ PHP 5.6 trở đi, bạn có thể sử dụng toán tử unpacking (...
) để đạt được kết quả tương tự.
function myFunction($param1, $param2, $param3) {
echo $param1 . ' ' . $param2 . ' ' . $param3;
}
$arr = [1, 2, 3];
myFunction(...$arr);
Khi chạy đoạn mã trên, nó sẽ truyền các giá trị 1
, 2
, 3
lần lượt vào các tham số $param1
, $param2
, $param3
của hàm myFunction
, và kết quả sẽ được in ra là 1 2 3
.
Toán tử unpacking (...
) cho phép bạn truyền các giá trị từ một mảng vào các tham số của một hàm một cách thuận tiện và linh hoạt. Tuy nhiên, lưu ý rằng toán tử unpacking chỉ khả dụng từ PHP 5.6 trở đi.
Ví dụ thực tế
Ứng dụng toán tử spread vào một mảng [1, 2, 3]
và truyền các giá trị lần lượt vào các tham số của một hàm, bạn có thể làm như sau:
const lp_arr = [1, 2, 3];
function lptechFunction(param1, param2, param3) {
var_dump(param1, param2, param3);
}
lptechFunction(...lp_arr);
Khi chạy đoạn mã trên, nó sẽ truyền các giá trị 1
, 2
, 3
lần lượt vào param1
, param2
, param3
của hàm lptechFunction
, và kết quả sẽ được in ra console là 1 2 3
.
Điều tuyệt vời là toán tử spread cũng hoạt động cho các mảng có số lượng phần tử thay đổi. Ví dụ, nếu mảng có 4 phần tử [4, 5, 6, 7]
, bạn vẫn có thể truyền các giá trị lần lượt vào 4 tham số của hàm tương ứng:
const lp_arr = [4, 5, 6, 7];
function lptechFunction(param1, param2, param3, param4) {
var_dump(param1, param2, param3, param4);
}
lptechFunction(...lp_arr);
Kết quả sẽ là
4 5 6 7
.
Với toán tử spread, bạn có thể dễ dàng truyền các giá trị trong một mảng vào các tham số của một hàm một cách linh hoạt, bất kể số lượng tham số là bao nhiêu.
ReflectionMethod::invokeArgs là gì ?
ReflectionMethod::invokeArgs
là một phương thức trong PHP Reflection API, cho phép bạn gọi một phương thức (method) của một đối tượng thông qua đối tượng ReflectionMethod và truyền các tham số bằng cách sử dụng một mảng các giá trị.
Đây là cú pháp của phương thức invokeArgs
:
public mixed ReflectionMethod::invokeArgs ( object $object , array $args )
Trong đó:
$object
là đối tượng mà phương thức sẽ được gọi từ.$args
là một mảng chứa các giá trị của các tham số sẽ được truyền vào phương thức.
Dưới đây là một ví dụ sử dụng ReflectionMethod::invokeArgs
:
class MyClass {
public function myMethod($param1, $param2, $param3) {
echo $param1 . ' ' . $param2 . ' ' . $param3;
}
}
$obj = new MyClass();
$reflectionMethod = new ReflectionMethod('MyClass', 'myMethod');
$arr = [1, 2, 3];
$reflectionMethod->invokeArgs($obj, $arr);
Trong ví dụ trên, chúng ta khởi tạo một đối tượng $obj
từ lớp MyClass
. Sau đó, chúng ta tạo một đối tượng ReflectionMethod $reflectionMethod
để đại diện cho phương thức myMethod
của lớp MyClass
. Cuối cùng, chúng ta truyền mảng $arr
chứa các giá trị tham số vào phương thức bằng cách sử dụng invokeArgs
.
Phương thức invokeArgs
sẽ gọi phương thức myMethod
trên đối tượng $obj
với các giá trị $param1 = 1
, $param2 = 2
, và $param3 = 3
. Kết quả sẽ được in ra là 1 2 3
.