__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 の特集でも紹介されているマジックメソッド、うまく使えばとても便利です。