無名関数って何?どうやって使うの?いつ使うの?という疑問に答えられる記事を目指して書いてみました。

 

無名関数とは、変数のように扱える関数のこと

PHP5.3以降で使える機能の1つに「無名関数」がありますが、無名ってどういうことでしょうか?

Wikipediaによれば、

無名関数とは、名前付けされずに定義された関数のことである。
(中略)
メリット
・一度しか使わない関数の名前を付けなくて済む。名前の衝突を考えなくて済む。
・関数の引数などに直接渡せる。

 

大雑把に言えば、「変数のように扱える関数=無名関数」と私は理解しています。つまり、

変数 何度でも値代入OK -
通常の関数 一度定義したらプログラム終了まで有効。
同じ名前の関数を2回以上定義NG.
まとまった処理を、ひとつの手続きとして呼び出せる
無名関数 何度でも定義し直しOK まとまった処理を、ひとつの手続きとして呼び出せる

という特徴があります。

 

無名関数の書き方

こんな感じで書きます。

$myfunc = function (引数1, 引数2,・・・) {
・・・処理・・・
return 返り値;
}

 

リンクタグを生成する無名関数を定義してみます。

$get_link_html = function($url, $title) {
return '<a href="'.$url.'">'.$title.'</a>';
}

 

この無名関数を使用するときは、こんなコードになります。

echo $get_link_html('http://wordpress.hitsuji.me', 'WordPressテーマの作り方');

 

この行が実行されると、次のようなHTMLが出力されます。

<a href="http://wordpress.hitsuji.me">WordPressテーマの作り方</a>

 

 

特定のテンプレートパーツで使う処理のまとめに便利

WordPressテーマをカスタマイズしていると、特定のテンプレートパーツ内だけで使いたい関数を定義したくなることがあると思います。そのようなとき、テンプレートパーツ内に通常の関数を定義すると、そのテンプレートパーツを複数回読み込まないように注意することが必要になります。

mylinks.php(通常の関数を使った場合)
function get_link_html($url, $title) {
return '<a href="'.$url.'">'.$title.'</a>';
}
echo get_link_html('http://wordpress.hitsuji.me', 'WordPressテーマの作り方');
echo get_link_html('http://hitsuji.me', 'Hitsuji x Web');
index.php
<?php
get_header();
get_template_part('mylink'); //1回目はOK

while(have_posts()) {
 the_post();
 get_template_part('content');
}

get_template_part('mylink'); //2回目はNG.関数 get_link_html()を重複定義してしまう!

 

とはいえ、1つのテンプレートパーツでしか使わない手続きをfunctions.phpに定義すると煩雑になってしまいがちです。こんなときに無名関数が便利です。

 

無名関数を使えば、そのテンプレートパーツが2回以上読み込まれようともOKです。

mylinks.php(無名関数を使った場合)
$get_link_html = function ($url, $title) {
return '<a href="'.$url.'">'.$title.'</a>';
}
echo $get_link_html('http://wordpress.hitsuji.me', 'WordPressテーマの作り方');
echo $get_link_html('http://hitsuji.me', 'Hitsuji x Web');
index.php
<?php
get_header();
get_template_part('mylink'); //1回目はOK

while(have_posts()) {
 the_post();
 get_template_part('content');
}

get_template_part('mylink'); //2回目もOK. 無名関数は$get_link_html再定義しても問題無し!

 

このように無名関数は便利な機能です。WordPressテーマカスタマイズにもオススメです。

 

「WordPress Tips」の記事