Quantcast
Channel: 親方、空から覚え書きが!
Viewing all articles
Browse latest Browse all 15

closure incoming

$
0
0

http://d.hatena.ne.jp/masugata/20080709#p1 いやっほおおお!日をまたいでいてすぐ眠りたいのですが、が… php-6.0-dev がベンチに座ってチャックを下ろす姿を見てホイホイ落としちゃったのだ。

<?php

$hikonyann = function ($multiplier)
{
    return str_repeat(’ひこにゃん’, $multiplier);
};

echo $hikonyann();
ひこにゃんひこにゃんひこにゃん

うんうんいいよー。レキシカル変数を参照するには?use () で宣言するのか。

$name = 'ひこにゃん';
$hikonyann = function ($multiplier) use ($name)
{
    return str_repeat($name, $multiplier);
};

echo $hikonyann(3) . PHP_EOL;
ひこにゃんひこにゃんひこにゃん

うんうんいいよー。このレキシカル変数は値渡し?参照渡し?

<?php

$name = 'ひこにゃん';
$hikonyann = function ($multiplier) use ($name)
{
    return str_repeat($name, $multiplier);
};

echo $hikonyann(3) . PHP_EOL;
$name = 'しまさこにゃん';
echo $hikonyann(3) . PHP_EOL;
ひこにゃんひこにゃんひこにゃん
ひこにゃんひこにゃんひこにゃん

値渡しですね。& で参照渡しになる、と。

$name = 'ひこにゃん';
$hikonyann = function ($multiplier) use (&$name)
{
    return str_repeat($name, $multiplier);
};

echo $hikonyann(3) . PHP_EOL;
$name = 'しまさこにゃん';
echo $hikonyann(3) . PHP_EOL;
ひこにゃんひこにゃんひこにゃん
しまさこにゃんしまさこにゃんしまさこにゃん

クラスと組み合わせると?

<?php

class Mascot
{
    private $name;
    
    public function __construct($name)
    {
        $this->name = $name;
    }
    
    public function generate()
    {
        return function ($multiplier)
        {
            return str_repeat($this->name, $multiplier);
        };
    }
}

$hikonyann = new Mascot('ひこにゃん');
$generator = $hikonyann->generate();
echo $generator(3) . PHP_EOL;
ひこにゃんひこにゃんひこにゃん

$this は明示的に指定しなくていいんだね。他は、どんな呼び出し方があるのかな?

<?php

$lamda = function () { debug_print_backtrace(); };

$lamda();
$lamda->__invoke();
call_user_func($lamda);
#0  lambda() called at [*:\********\closure.php:5]
#0  lambda()
#1  Closure->__invoke() called at [*:\********\closure.php:6]
#0  lambda()
#1  call_user_func(Closure Object ()) called at [*:\********\closure.php:7]

あら?オブジェクト?

<?php echo get_class(function () {});
Closure

まぁ、Closure クラスですって!ReflectionObject の出番よ。

<?php Reflection::export(new ReflectionObject(function () {}));
Object of class [ <internal> final class Closure ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Dynamic properties [0] {
  }

  - Methods [0] {
  }
}

まっさら。__invoke() はマジックメソッド扱いなのかしら?

時間が出来たら詳しく調べます…。


Viewing all articles
Browse latest Browse all 15

Trending Articles