Search

検索したいワードを入力してください

2019年02月19日

【PHP入門】無名関数とは?特徴と使い方を解説|クロージャ

近年、Webアプリケーション開発では、無名関数がよく使われるようになってきました。この記事では、無名関数のメリットや、無名関数の基本的な使い方について、サンプルコードを使いながら、わかりやすく解説していますので、ぜひ読んでみてください。

PHPの無名関数とは

無名関数とは、関数名を定義しない関数のことです。匿名関数、クロージャとも呼ばれています。通常、関数には名前を定義するのが一般的です。プログラムが関数を呼び出す際に、関数の名前が必要だからです。

ただし、1回限り呼び出すだけの関数なら直接呼び出してしまえば、名前をつける必要はなくなります。使いきりの関数には、名前を定義しない無名関数がよく使われます。

無名関数を使うメリットとは

メリット1 関数名が増えない

原則的に、関数名は同じ名前で関数を作成できないので、関数がたくさん増えてくると、名前の管理が大変になってきます。規模の大きな開発であれば、日々、関数は追加されていくでしょう。

過去に作成した関数と同じ関数名を定義しようとして、不意にエラーが起きることもしばしばあります。

無名関数は関数名を定義しないので、関数名の重複を考える必要はありません。1回呼び出すだけの関数であるなら、わざわざ関数名をつけないほうが、関数を管理しておく手間が軽減されます。

メリット2 引数に無名関数が使える

関数には変数を引数として渡すことができます。無名関数は変数に入れておくことができるので、引数として関数(無名関数)を渡すことができます。関数内の処理の中では「引数として渡した関数(無名関数)」を実行させることができます。

このような関数のことを「コールバック関数」と呼びます。コールバック関数については、後ほどサンプルコードを使いながら、詳しく解説していきます。

メリット3 処理の流れが読みやすい

名前を定義した関数の場合、メインプログラムと処理が独立するため、関数が増えていけば、処理がどんどん分かれていくことになり、流れが読みづらくなります。

無名関数の場合、メインプログラムの処理の流れの上に、無名関数の処理を書くのが一般的なので、比較的、処理の流れが読みやすくなります。

PHPで無名関数を使う方法

PHPは、バージョン5.3から無名関数が使えるようになりました。ここでは、PHPで無名関数を使う方法について、サンプルコードを使いながら、詳しく解説していきます。

ますは通常の関数の使い方を見ていきます。

PHPサンプルコード
//通常の関数を関数名「funcA」で定義する
function funcA(){
return '通常の関数です。';
};

//無名関数を実行する
echo 'この関数は' . funcA();


実行結果
この関数は通常の関数です。

サンプルコードでは「funcA」を呼び出すことで、funcA内の処理が実行されました。

次に、同じ処理を無名関数を使って作成してみます。

PHPサンプルコード
//無名関数を定義する
$funcA = function(){

return '無名関数です。';
};

//無名関数を実行する
echo 'この関数は' . $funcA();

実行結果
この関数は無名関数です。

こちらも同じく、funcA内の処理が実行されました。ただし、通常の関数は関数名「funcA」を使って呼び出しているのに対して、無名関数では、関数を格納した変数「$funcA」を使って関数呼び出しています。

通常の関数だと、新しい関数を「funcA」で定義するとエラーになりますが。無名関数の場合、「$funcA」に新しい関数を上書きすることができます。

PHPで無名関数に引数を渡す方法

通常の関数と同じく無名関数にも引数を渡すことができます。最初に通常の関数への引数の渡し方について見ていきます。

PHPサンプルコード
//通常の関数を定義する
function funcB( $a , $b ){

return $a + $b;
};

//通常の関数に引数を渡して実行する
echo '合計:' . funcB( 2 , 3 );

実行結果
合計:5

サンプルコードでは、関数の処理の中で引数を合計しています。

次に、同じ処理を無名関数を使って作成してみます。

PHPサンプルコード
//無名関数を定義する
$funcB = function( $a , $b ){

return $a + $b;
};

//無名関数に引数を渡して実行する
echo '合計:' . $funcB(2,3);

実行結果
合計:5

引数の渡し方は通常の関数と特に変わりなく渡すことができます。処理も同じ結果になります。

PHPでコールバック関数を使う方法

コールバック関数を使ってみます。コールバック関数とは、関数の引数に使う関数です。しかしおそらくそう言われてもよくわからないと思います。

コールバック関数は少し複雑なので、いくつか実際に関数を作成していきながら、解説していきます。

最初に準備として、ランダムに格納された数字のリストを用意しておきます。

$array = [ 12 , 10 , 3 , 5 , 8 ];

コールバック関数を使わない関数のサンプルコード

まずは、コールバック関数を使わず、先ほど準備しておいた数字のリストの中から「最小値を取得する関数」を作成してみます。

PHPサンプルコード
//最小値を取得する関数
function getMin($list){
//先頭の数値を現在の値とする
$value = $list[0];
for( $i = 1 ; $i < count($list) ; $i++ ) {
if ( $value > $list[$i] ) {
//現在の値より小さい場合、値を置き換える
$value = $list[$i];
}
}
return $value;
}

数字のリストを反復しながら、一つづつ数字を比較していき、最小値を格納する値を置き換えています。

作成した関数を実行してみます。

PHPサンプルコード
//通常の関数でリストから最小値を取得する
echo getMin( [ 12 , 10 , 3 , 5 , 8 ] );

実行結果
3

このサンプルコードでは、最小値の3を取り出すことができました。しかし、この関数では最小値しか取り出すことができませんので、少し複雑な関数に修正します。

引数にモードを追加して、「最小値か最大値のどちらかを取得する関数」を作成してみます。

PHPサンプルコード
//最小値か最大値を取得する関数
function getMinOrMax($list , $mode ){
//先頭の数値を現在の値とする
$value = $list[0];
for( $i = 1 ; $i < count($list) ; $i++ ) {
if ($mode == 1) {
//モード1:最小値を取得する
if ( $value > $list[$i] ) {
//現在の値より小さい場合、値を置き換える
$min = $list[$i];
}
} else if ($mode == 2) {
//モード2:最大値を取得する
if ( $value < $list[$i] ) {
//現在の値より大きい場合、値を置き換える
$min = $list[$i];
}
}
}
return $value;
}

かなりコードが長くなりましたが、モードが1の時は最小値、モードが2の時は最大値といった具合に条件分けしています。モードを増やしていけば、別の判定処理を追加していくこともできます。

作成した関数を実行してみます。

PHPサンプルコード
//通常の関数でリストから最小値を取得する
echo getMinOrMax([ 12 , 10 , 3 , 5 , 8 ] , 1 );

実行結果
12


PHPサンプルコード
//通常の関数でリストから最大値を取得する
echo getMinOrMax([ 12 , 10 , 3 , 5 , 8 ] , 2 );

実行結果
3

引数にモードを追加することで、最小値と最大値を一つの関数で取り出すことができました。しかし、こういった場合、コールバック関数を使ったほうが、処理をスッキリさせることができます。

コールバック関数を使った関数のサンプルコード

最初に、「引数にコールバック関数を渡す関数」を作成してみます。

PHPサンプルコード
//コールバック関数を使ってリストから数字を取得する
function getNumberWithCallback($list , $callback){
//先頭の数値を現在の値とする
$value = $list[0];
for( $i = 1 ; $i < count($list) ; $i++ ) {
//判定処理はコールバック関数で判定する
if ( $callback( $value , $list[$i] ) ) {
//コールバック関数の戻り値がtureの場合、値を置き換える
$result = $month;
}
}
return $value;
}

次に「最小値を判定するコールバック関数」を作成して、引数に渡してみます。

PHPサンプルコード
//コールバック関数を使ってリストから最小値を取得する
echo getNumberWithCallback( [ 12 , 10 , 3 , 5 , 8 ] , function ( $value1 , $value2 ){
if ($value1 > $value2 ) {
//値1より値2が小さい場合
return true;
} else {
return false;
}
});

実行結果
3

「最大値を判定するコールバック関数」も作成して、引数に渡してみます。

PHPサンプルコード
//コールバック関数を使ってリストから最大値を取得する
echo getNumberWithCallback( [ 12 , 10 , 3 , 5 , 8 ] , function ( $value1 , $value2 ){
if ($value1 < $value2 ) {
//値1より値2が大きい場合
return true;
} else {
return false;
}
});

実行結果
12

引数にコールバック関数を指定することで、最小値と最大値を取り出すことができました。コールバック関数を利用すると、元の関数の処理に変更を加えること無く、自由に処理が追加できます。

無名関数はWordPressでも便利

WordPressにはアクションフックやフィルターフックと呼ばれる、WordPressのあらゆるタイミングで独自の処理を追加できる仕組みがあります。WordPressのフックにも無名関数がよく使われています。

WordPressはPHPフリーランスの最初の案件としては定番のものの1つなので、フリーランスを目指している人は、しっかりと勉強しておくといいでしょう。

WordPressのフックで無名関数を使用する方法

WordPressのアクションフックに独自の処理を定義したい場合、以下の書き方になります。

do_action( イベント名 , コールバック関数 );

例えば、WordPressで<head>タグに独自のタグを追加したい場合、以下のように実行します。この時、無名関数を使用するとすっきりとしたコードになります。

PHPサンプルコード
do_action( ”wp_head” , function(){
 //ヘッダタグにスクリプトタグを追加する
echo "<script src='http://sample.jp/sample.js' >";
} );

Wordpressのフックには無名関数を使ったほうが良い理由

WordPressのフックはとても便利な仕組みなので一度慣れてしまうと、フックの仕組みを多用したくなります。その時、問題となってくるのはやはり関数名の重複です。

過去に作成したフックの関数名は利用できませんし、WordPressに標準で用意されている関数名も利用できません。 原則、WordPressのフックに渡す関数は無名関数にしておいた方が、不必要な問題やエラーを減らすことができます。

PHPで無名関数を使ってコードを無駄なくすっきりさせよう

いかがだったでしょうか。無名関数の基本的な使い方についてご紹介しました。

PHP言語に限らず、無名関数は色々な場面で多く利用されています。無名関数に慣れないうちは、使い方に難しい点が多いですが、習得できればスッキリとしたコードを書くことができます。

この記事を読んで、ぜひ無名関数をマスターしてみてください。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related