PHPの無名関数
無名関数って何?どうやって使うの?いつ使うの?という疑問に答えられる記事を目指して書いてみました。
無名関数とは、変数のように扱える関数のこと
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」の記事
- WordPressでSVG画像を扱えるようにする
- ウィジェットタイトルを画像に置き換える方法
- 見出し行数をカウントするスクリプトを書いてみた
- 別の投稿を丸ごと挿入するプラグインを作ってみた
- 著者ページの削除方法
- PHPの無名関数 << この記事です
- タクソノミーの名前を変更する
- ブログ投稿インデックスページとは?
- カテゴリIDを階層順に並べた配列をつくる
- Eclipse-PDTでXDebugでブレークしないときの対処法まとめ
- Mac OSX Lionに入れたWordPressをEclipsePDTでデバッグできるようにする
- MacにWordPressのプラグインインストールできないときの対処法
- Mac OSX LionにApache、MySQL、PHP、WordPressを入れる
- カスタム投稿にカテゴリやタグを追加する
- slideshareをWordPressに貼付ける方法まとめ
- スタイルシート初歩の前
- Windows7でWordPressテーマを開発するときのトラブル
- BitNamiの基本事項 for mac
- WordPressにおける連想配列を理解する