プログラミング: 2008年7月アーカイブ

closure の記事を書いた後に気付いたんですが、クラスに __invoke() メソッドが定義されてると関数のように呼び出せるんですね。こいつぁ使える!

<?php

class A
{
    public function __invoke()
    {
        echo 'ひえひえ細胞';
    }
}

$a = new A();
$a();

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() はマジックメソッド扱いなのかしら?

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

このアーカイブについて

このページには、2008年7月以降に書かれたブログ記事のうちプログラミングカテゴリに属しているものが含まれています。

前のアーカイブはプログラミング: 2008年5月です。

次のアーカイブはプログラミング: 2008年8月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.12