iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0

匿名函式 Anonymous functions

我覺得寫程式最難的是 命名,怎麼 變數命名、函式命名、類別命名..等,想一個有意義的名稱,挺困難的!當時,我看到 Anonymous function (匿名函式),仿佛看到一道曙光,終於可以省點命名的腦力。
Anonymous function, closure 在 Laravel 是經常被用到的方法之一,對於我而言,通常先會用功能,再去查查功能的名稱。習慣用 laravel 後,會忘記 PHP 是 laravel 基底,因此,看到 Closure (閉包) ,亦可以從 Anonymous function 找尋使用方式。Anonymous functions are implemented using the Closure class. -出至 PHP 文件
Anonymous function 在 PHP 也是有段進化史,喜歡考古的朋友,這邊有 PHP文件-Anonymous functionswiki-匿名函式 可以爬爬。

Anonymous functions 注意事項

  • 閉包 (closure) 分配給變數使用時,閉包 (closure) 必須尾隨 ;,如:
<?php
$sub = function ($a, $b){
    return $a - $b;
};

echo $sub(5, 3).PHP_EOL; // 2
  • 使用 use 賦予 閉包 (closure) 函式變數,如:
    • 函式變數 必須包含在 ()
    • 從 PHP 7.1 起,以下變數不能繼承到閉包 的 函式變數: superglobals 、 $this 或者和參數重名。
<?php
$message = 'hello';
$example = function () use ($message) {
    return $message;
};
echo $example(); // hello

Anonymous functions, Closure 應用

  • array_map(?callable $callback, array $array, array ...$arrays): array
<?php
$numbers = [1, 2, 3, 4, 5];

// 使用匿名函數將每個數字 *2
$doubledNumbers = array_map(function ($number) {
    return $number * 2;
}, $numbers);

print_r($doubledNumbers);
/* 輸出結果:
 * 2
 * 4
 * 6
 * 8
 * 10
 */ 
  • 使用 use 賦予 閉包 (closure) 函式變數 搭配 Named Arguments
<?php
$names = ['Tom', 'Mia', 'Amy'];
 
$greeting = 'Hello, ';
 
$sentences = array_map(
    callback: function (string $name) use ($greeting) {
        return $greeting.$name;
    },
    array: $names,
);

/* 輸出結果:
 * Hello, Tom
 * Hello, Mia
 * Hello, Amy
 */ 
  • Closure 應用在 Laravel
<?php
Route::get('/hello', function () {
    return 'Hello, Laravel!';
});

Route::get('/hello/{name}', function ($name) {
    return 'Hello, ' . $name . '!';
});

結語

Anonymous Functions 和 Closures 用來減輕命名的負擔,使得程式更加靈活和有彈性,因此,在 Laravel 蠻常看到,故本文補充我當初疑惑 Anonymous Functions 和 Closures 可以怎麼用。


參考文章

1 PHP文件-Anonymous functions
2 wiki-匿名函式
3 superglobals


上一篇
[Day 24] PHP 8.0.0 之好用功能 Named Arguments
下一篇
[Day 26] 箭頭函式 Arrow Functions
系列文
PHP 沿途的風景30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言