マジックメソッドで遊んでみる

__call(), __get(), __toString() を使って実験。

<?php

class MagicChain
{
    private $_name;

    public function __construct($name = 'root')
    {
        $this->_name = (string)$name;
    }

    public function __call($name, $args)
    {
        return new MagicChain(sprintf('%s::%s(%s)', $this->_name, $name, serialize($args)));
    }

    public function __get($name)
    {
        return new MagicChain($this->_name . '::' . $name);
    }

    public function __toString()
    {
        return $this->_name;
    }
}

$obj = new MagicChain;
echo $obj->foo('bar')->hoge->fizz('buzz');

このコードの出力が PHP 5.1.6 & 5.2.3 では

root::foo(a:1:{i:0;s:3:"bar";})::hoge::fizz(a:1:{i:0;s:4:"buzz";})

期待通り、このようになりました。
PECL に応用すればオブジェクト指向Python バインディングとか Io バインディングも作れそうです。(PECL 脳の弊害)


W+D vol.39 の特集でも紹介されているマジックメソッド、うまく使えばとても便利です。

WEB+DB PRESS Vol.39

WEB+DB PRESS Vol.39