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