php – 匿名函數 – 傳遞參數與繼承變數適合的使用場景

匿名函數(Anonymous functions、匿名函式、閉包)可允許創建一個沒有固定名稱的函數,雖然可以用在臨時使用,但其實比較常用在回調(回呼、callback)的狀況。

傳遞參數 (傳值呼叫 Call By Value)

$example = function ($time){
	return $time;
};

echo $example('08:01'); // 輸出 08:01

 

繼承變數

這跟傳遞參數的效果蠻似的,使用的時機差別,可以參考最後的類別應用。

$name = 'Jason';
$message = 'Hello';

// 繼承 $name, $message
$example = function () use ($name, $message) {
	return "{$name}:{$message}";
};
echo $example(); // 輸出 Jason:Hello

 

參考 (傳址呼叫 Call By Reference)

$name = 'Jason';
$message = 'Hello';

// 繼承 $name, $message
$example = function () use ($name, &$message) {
	return "{$name}:{$message}";
};

$message = 'Good Morning';

echo $example(); // 輸出 Jason:Good Morning

 

傳值+繼承變數+參考

$name = 'Jason';
$message = 'Hello';

// 繼承 $name, $message
$example = function ($time) use ($name, &$message) {
	return "{$name}:{$message} - {$time}";
};

$message = 'Good Morning';

echo $example('08:01'); // 輸出 Jason:Good Morning - 08:01

 

在類別的應用

class Chat 
{
	public function say($callback)
	{
		$time = '08:01';
		return $callback('08:01');
	}
}
$name = 'Jason';
$message = 'Hello';
$chat = new Chat;
echo $chat->say(function () use ($name, $message){
	return "{$name}:{$message}";
});
// 輸出 Jason:Hello

$message = 'Good Morning';

echo $chat->say(function () use ($name, &$message){
	return "{$name}:{$message}";
});
// 輸出 Jason:Good Morning

echo $chat->say(function ($time) use ($name, &$message){
	return "{$name}:{$message} - {$time}";
});
// 輸出 Jason:Good Morning - 08:01
  • $time 是由匿名函數內部傳遞到外部
  • $name 與 $message 由匿名函數外部傳遞到內部

我想這個就是傳遞參數與繼承變數適合的使用場景。

發表迴響