PHP - Chuyển giao hàm: Hướng dẫn cho người mới bắt đầu

Xin chào các bạn đang học lập trình PHP! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của việc chuyển giao hàm trong PHP. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, giải thích mọi thứ từng bước với rất nhiều ví dụ. Hãy cùng bắt đầu nào!

PHP - Passing Functions

Các hàm Callable là gì?

Trước khi bắt đầu, hãy hiểu rõ chúng ta muốn nói gì khi đề cập đến "chuyển giao hàm." Trong PHP, các hàm có thể được coi là dữ liệu, có nghĩa là chúng ta có thể truyền chúng như các đối số cho các hàm khác. Các hàm có thể truyền được thường được gọi là "callable" hoặc "callbacks."

Hãy tưởng tượng bạn có một hộp ma thuật (một hàm) có thể thực hiện các trò戏 khác nhau dựa trên các hướng dẫn (một hàm khác) bạn đặt vào trong nó. Đó chính là điều chúng ta đang làm khi chuyển giao hàm!

array_map(): Chuyển đổi mảng một cách dễ dàng

Hãy bắt đầu với một trong những hàm thường được sử dụng nhất để truyền callbacks: array_map().

array_map() làm gì?

array_map() áp dụng một hàm callback cho từng phần tử của một mảng và trả về một mảng mới với kết quả.

Ví dụ 1: Nhân đôi số

$numbers = [1, 2, 3, 4, 5];

$doubled = array_map(function($n) {
return $n * 2;
}, $numbers);

print_r($doubled);

Kết quả:

Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10
)

Trong ví dụ này, chúng ta đang truyền một hàm ẩn danh (còn gọi là closure) cho array_map(). Hàm này nhận từng số và nhân nó với 2. Kết quả là một mảng mới với tất cả các số đã nhân đôi.

Ví dụ 2: Viết hoa chữ cái đầu tiên của tên

$names = ['alice', 'bob', 'charlie'];

$capitalized = array_map('ucfirst', $names);

print_r($capitalized);

Kết quả:

Array
(
[0] => Alice
[1] => Bob
[2] => Charlie
)

Ở đây, chúng ta đang truyền hàm内置 PHP ucfirst dưới dạng chuỗi. array_map() áp dụng hàm này cho từng tên, viết hoa chữ cái đầu tiên.

call_user_func(): Dao cụ đa năng của việc gọi hàm

call_user_func() là một hàm linh hoạt cho phép bạn gọi bất kỳ hàm callable hoặc phương thức nào.

Ví dụ 3: Gọi một hàm đơn giản

function greet($name) {
return "Hello, $name!";
}

$result = call_user_func('greet', 'World');
echo $result;  // Xuất: Hello, World!

Trong ví dụ này, chúng ta đang truyền tên của hàm ('greet') dưới dạng chuỗi, tiếp theo là các đối số của nó.

Ví dụ 4: Gọi phương thức của một đối tượng

class Greeter {
public function sayHi($name) {
return "Hi, $name!";
}
}

$greeter = new Greeter();
$result = call_user_func([$greeter, 'sayHi'], 'PHP');
echo $result;  // Xuất: Hi, PHP!

Ở đây, chúng ta đang gọi phương thức của một đối tượng. Chúng ta truyền một mảng chứa đối tượng và tên phương thức, tiếp theo là các đối số.

usort(): Sắp xếp tùy chỉnh với callbacks

usort() là một hàm mạnh mẽ cho phép bạn sắp xếp một mảng bằng cách sử dụng một hàm so sánh tùy chỉnh.

Ví dụ 5: Sắp xếp một mảng các đối tượng

class Person {
public $name;
public $age;

public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}

$people = [
new Person('Alice', 30),
new Person('Bob', 25),
new Person('Charlie', 35)
];

usort($people, function($a, $b) {
return $a->age - $b->age;
});

foreach ($people as $person) {
echo "{$person->name}: {$person->age}\n";
}

Kết quả:

Bob: 25
Alice: 30
Charlie: 35

Trong ví dụ này, chúng ta đang sắp xếp một mảng các đối tượng Person dựa trên tuổi của họ. Hàm callback so sánh tuổi của hai người và trả về một giá trị âm, không hoặc dương để xác định thứ tự của họ.

Truyền callbacks đến các hàm tự định nghĩa

Bây giờ chúng ta đã xem qua cách các hàm内置 PHP sử dụng callbacks, hãy tạo một hàm của riêng chúng ta để chấp nhận một callback.

Ví dụ 6: Tạo một hàm myMap tùy chỉnh

function myMap($array, $callback) {
$result = [];
foreach ($array as $item) {
$result[] = $callback($item);
}
return $result;
}

$numbers = [1, 2, 3, 4, 5];

$squared = myMap($numbers, function($n) {
return $n * $n;
});

print_r($squared);

Kết quả:

Array
(
[0] => 1
[1] => 4
[2] => 9
[3] => 16
[4] => 25
)

Trong ví dụ này, chúng ta đã tạo một hàm myMap của riêng mình hoạt động tương tự như array_map. Nó nhận một mảng và một hàm callback, áp dụng hàm callback cho từng phần tử và trả về một mảng mới với kết quả.

Kết luận

Chúc mừng! Bạn vừa bước những bước đầu tiên vào thế giới của việc chuyển giao hàm trong PHP. Chúng ta đã xem qua array_map(), call_user_func(), usort(), và thậm chí tạo ra một hàm của riêng mình chấp nhận callbacks.

Nhớ rằng việc chuyển giao hàm là một kỹ thuật mạnh mẽ cho phép bạn viết mã linh hoạt và tái sử dụng. Nó giống như có một cây dao瑞士军刀 trong bộ công cụ lập trình của bạn - linh hoạt và luôn sẵn sàng để giải quyết các nhiệm vụ khác nhau!

Khi bạn tiếp tục hành trình học PHP, bạn sẽ tìm thấy nhiều cơ hội hơn để sử dụng các kỹ thuật này. Hãy tiếp tục thực hành, và sớm bạn sẽ chuyển giao hàm như một chuyên gia!

Dưới đây là bảng tham khảo nhanh các hàm chúng ta đã thảo luận:

Hàm Mô tả Ví dụ sử dụng
array_map() Áp dụng một callback cho tất cả các phần tử của một mảng Chuyển đổi các phần tử của mảng
call_user_func() Gọi một callback với các tham số Gọi các hàm hoặc phương thức một cách linh hoạt
usort() Sắp xếp một mảng bằng cách sử dụng một hàm so sánh tùy chỉnh Sắp xếp các mảng tùy chỉnh

Chúc mừng coding, và nhớ rằng - trong thế giới của PHP, các hàm là bạn của bạn!

Credits: Image by storyset