忘れないように記録しとこ

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

概要

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

環境

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: 夢 とは言い切れない 文字です

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

最後のひとこと

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

この記事が気に入ったら
いいね ! しよう

Twitter で

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください