PHP - 函数傳遞:初學者指南

你好,有抱負的PHP開發者!今天,我們將踏上一段令人興奮的旅程,探索PHP中傳遞函數的世界。別擔心你對編程還是新手——我將成為你的友好導遊,一步步地解釋一切,並提供大量的範例。那麼,我們就開始吧!

PHP - Passing Functions

Callable函數是什麼?

在我們開始之前,讓我們先了解所謂的“傳遞函數”是指什麼。在PHP中,函數可以被當作數據對待,這意味著我們可以把它們作為參數傳遞給其他函數。這些可傳遞的函數通常被稱為“callable”或“callbacks”。

想像你有一個魔法盒子(一個函數),它可以根據你放入其中的指示(另一個函數)來表演不同的戲法。這就是我們在傳遞函數時所做的事情!

array_map():輕鬆轉換數組

讓我們從最常見的用於傳遞回調的函數之一開始:array_map()

array_map()是做什麼的?

array_map() 對數組中的每個元素應用一個回調函數,並返回一個包含結果的新數組。

範例 1:數字翻倍

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

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

print_r($doubled);

輸出:

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

在這個範例中,我們傳遞了一個匿名函數(也稱為閉包)給array_map()。這個函數將每個數字乘以2。結果是一個所有數字都翻倍的新數組。

範例 2:名稱首字母大寫

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

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

print_r($capitalized);

輸出:

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

這裡,我們傳遞了內置的PHP函數ucfirst作為字符串。array_map() 將此函數應用於每個名稱,將首字母大寫。

call_user_func():函數調用的瑞士軍刀

call_user_func() 是一個多功能的函數,它允許你調用任何可調用的函數或方法。

範例 3:調用一個簡單函數

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

$result = call_user_func('greet', 'World');
echo $result;  // 輸出:Hello, World!

在這個範例中,我們傳遞了函數名稱('greet')作為字符串,然後是它的參數。

範例 4:調用對象的方法

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

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

在這裡,我們調用了一個對象的方法。我們傳遞了一個包含對象和方法名稱的數組,然後是參數。

usort():使用回調進行自定義排序

usort() 是一個強大的函數,它允許你使用自定義的比較函數對數組進行排序。

範例 5:對對象數組進行排序

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";
}

輸出:

Bob: 25
Alice: 30
Charlie: 35

在這個範例中,我們根據年齡對Person對象數組進行排序。回調函數比較兩個人的年齡,並返回負數、零或正數以確定它們的順序。

將回調傳遞給用戶定義的函數

現在,我們已經看到了PHP內置函數如何使用回調,讓我們創建一個接受回調的自己的函數。

範例 6:創建一個自定義的map函數

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);

輸出:

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

在這個範例中,我們創建了自己的myMap函數,它的行為與array_map相似。它接受一個數組和一個回調函數,將回調應用於每個元素,並返回結果的新數組。

結論

恭喜你!你已經邁出了在PHP中傳遞函數世界的第一步。我們已經介紹了array_map()call_user_func()usort(),甚至創建了我們自己的接受回調的函數。

記住,傳遞函數是一種強大的技術,它讓你能夠編寫更靈活、可重用的代碼。這就像在你的編碼工具包中有一把瑞士軍刀——多用途且隨時準備應對不同的任務!

隨著你繼續在PHP的旅程上前行,你會發現許多使用這些技術的機會。持續練習,很快你就能像專家一樣傳遞函數!

以下是這些函數的快速參考表:

函數 描述 範例用例
array_map() 對數組中的所有元素應用一個回調 轉換數組元素
call_user_func() 調用一個回調和參數 動態調用函數或方法
usort() 使用自定義的比較函數對數組進行排序 自定義數組排序

開心編程,並記住——在PHP的世界裡,函數是你的朋友!

Credits: Image by storyset