taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

最近PHP(5.3.8)で「えー」と思ったこと

<?php
class Foo
{
    public $_foo = new stdClass;
}

 これがシンタックスエラー。

<?php
class Foo
{
    private $_foo = array('bar' => function() {})
}

 これもシンタックスエラー。 

<?php
class Foo
{
    private $_foo = array('bar' => array('baz' => 0))

    public function __construct()
    {
        $b = $this->_foo['bar'];
        $b['buz'] = 1;
    }

    public function getBaz()
    {
        return $this->_foo['bar']['baz'];
    }
}

$f = new Foo;
$f->getBaz(); // => 0

 これを回避するには

<?php
class Foo
{
    private $_foo = array('bar' => array('baz' => 0))

    public function __construct()
    {
        $b = &$this->_foo['bar'];// 参照を渡す!
        $b['buz'] = 1;
    }

    public function getBaz()
    {
        return $this->_foo['bar']['baz'];
    }
}

$f = new Foo;
$f->getBaz(); // => 1

 上記を応用して、2番目のClosureを入れるやつは、以下のコードならコンパイルが通る。

<?php
class Foo
{
    private $_foo = array()

    public function __construct()
    {
        $f = &$this->_foo;
        $f['bar'] = function() {};
    }
}

 まあ、わかってる人にはわかってるけど、知らない人は絶対ハマる、というかイラつく。