PHPで関数を変数に格納(クロージャ)する

2015年6月24日

概要

ずっとやり方を探していたのですが、ようやくやり方が分かったのでメモ

環境

PHP 5.3.3
Codeigniter 2.2.22 (フレームワーク)

検証

まずは、コントローラーを作ります。
テストで以下のような test コントローラーを作ります。


#コントローラー

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Test extends CI_Controller {

public $fast_cnt = 0,
$cnt = 0;

public function __construct()
{
parent::__construct();
}

public function index()
{
$b = '文字';

$data['test'] = $this->name('', $b);

echo $data['test']('うんこ');
echo $test('ごみ', '宝物'); // 宝物は適用されない
echo $test('夢');

}

 // キャッシングされる
private function name($a="", $b)
{
echo $this->fast_cnt++.'<br>'; // 一度しか動作しない

return function ($a) use ($b)
{
$this->cnt++; // キャッシュ

return $this->cnt.': '.$a.' とは言い切れない '.$b.'です<br>';
};
}

?>

以上のようなファイルを用意して、
検証してみると以下のような出力結果になる

0
1: うんこ とは言い切れない 文字です
2: ごみ とは言い切れない 文字です
3: 夢 とは言い切れない 文字です

つまり、変数に関数を格納することに成功していますね。

最後のひとこと

まだ検証が必要なところが色々あるので、
気が向いたらまた続きを書こうと思います。

  • この記事を書いた人

カバノキ

印刷会社のWEB部隊に所属してます。 WEB制作に携わってから、もう時期10年になります。 普段の業務では、PHPをメインにサーバーサイドの言語を扱っています。 最近のお気に入りはJavascriptです。 Vue.jsを狂喜乱舞しながら、社内に布教中です。

-PHP