こんにちは。明月です。
今回はphpの匿名関数(ラムダ)とクロージャに関して調べてみました。
匿名関数は既存phpで宣言した「function methodname($param)」の形じゃなく、「function($param)」という関数名がないことです。関数名がないというのは一回性の関数で「javascript」とコールバック関数とにみたいな流れの関数です。
<?php
function runTest($func) {
//$funcが関数の可否をチェックする。(javascriptでtypeof 変数 === "function"と同じ意味)
if (is_callable($func)) {
// 関数を実行してパラメータの10と5を入れる。
return $func(10, 5);
}
return 0;
}
// 匿名関数でrunTest関数に関数を入れました。
$add = runTest(function ($a, $b) {
// 上のところで「10」と「5」のパラメータを渡したので「$a」、「$b」は「10」と「5」です。
// 10と5を足すと結果は15です。
return $a + $b;
});
// 匿名関数でrunTest関数に関数を入れました。
$subtract = runTest(function ($a, $b) {
// 上のところで「10」と「5」のパラメータを渡したので「$a」、「$b」は「10」と「5」です。
// 10から5を引くと結果は5です。
return $a - $b;
});
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
<!-- $addの結果は「15」です。-->
add : <?=$add?>
<br />
<!-- $subtractの結果は「5」です。-->
subtract : <?=$subtract?>
</body>
</html>
上の例をみればrunTest関数に2つのメソッド名がないメソッドを渡します。この関数では「$add」と「$substract」に結果を渡すための一回性の関数です。
クロージャとは「java」と「C#」、「javascript」のクロージャと同じ概念です。クロージャと言うのは関数内部じゃないところで宣言した変数を関数の中で使えることです。
実際にメモリ上では別のメモリ領域なので共有ができないですが、ソース上でメモリを共有するような機能になっています。
<?php
$message = 'hello';
// lambda式(匿名関数)
$example1 = function () {
var_dump($message);
};
// lambda式(匿名関数)
// クロージャ機能を使うようには「use」で$message変数を使うと宣言する。
$example2 = function () use ($message) {
var_dump($message);
};
// 関数実行!
$example1();
$example2();
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body></body>
</html>
上の例をみれば$message変数に「hello」という値を入力しました。各匿名関数「$example1」と「$example2」を作成しました。
$example1の関数では「$message」変数を参照するとエラーが発生します。エラー内容は宣言してない変数使用ということになっています。
なぜなら$messageの変数は$example1関数外で宣言したものからです。でも、$example2では$messageを使いますね。
useキーワードを利用して関数外の変数を使えるようにしたからです。
link - https://www.php.net/manual/en/functions.anonymous.php
link - https://www.php.net/closure
「Study / PHP」の他投稿
- [CakePHP] Cakeフレームワークでデータベースに接続する時に使うQuery式とEntityクラス、Tableクラス、ResultSet2020/02/17 08:16:23
- [CakePHP] データベース(MariaDB(Mysql))を接続する方法2020/02/14 03:00:00
- [PHP] namespaceとuse2020/02/13 03:00:00
- [CakePHP] RequestとResponseに関して2020/02/12 03:00:02
- [CakePHP] PHPのCakeからAjax要請がある時、jsonタイプ(json_encode関数)でResponseする方法とControllerでViewを選択する方法2020/02/08 03:00:00
- [CakePHP] MVCフレームワークのCakeをインストールする方法2020/02/07 03:00:02
- [PHP] 自動require及びincludeをする方法(spl_autoload_register)2020/02/05 03:00:00
- [PHP] 匿名関数(ラムダ式)とクロージャ(closure)2020/02/04 03:00:00
- [PHP] PHPのコーディング領域とデザイン領域を分離するテンプレートライブラリ Smarty2020/02/02 03:00:00
- [PHP] Reflection - Variable編2020/02/01 03:00:00
- [PHP] Reflection - Method編2020/01/31 03:00:00
- [PHP] Reflection - Class編2020/01/30 03:00:00
- [PHP] エラーページ処理方法(追加: ob_cleanとdie関数使用方法)2020/01/29 03:00:00
- [PHP] 分散設定ファイル(.htaccess) 使用方法2020/01/28 03:00:00
- [PHP] データベース(mariaDB)を連結して使う方法2020/01/24 03:00:00
最新投稿
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07