- var_dump: documentation ( source)
- in_array: documentation ( source)
<?php
// explicit mention of methods that should be fluent
// would be preferable to returning $this on null
// since a method may very well return null as something
// that is expected.
interface Something {
public function bar();
public function baz();
public function bat();
}
interface SomethingFluent extends Something {
public function bar();
public function baz();
public function bat();
}
class Foo implements Something
{
public function bar()
{
var_dump(__METHOD__);
}
public function baz()
{
var_dump(__METHOD__);
}
public function bat()
{
var_dump(__METHOD__);
return 'bat!';
}
}
class FluentWrapper implements SomethingFluent
{
private $instance;
private $fluentMethods;
public function __construct($instance, array $fluentMethods = array())
{
$this->instance = $instance;
$this->fluentMethods = $fluentMethods;
}
public function __call($name, $args)
{
$result = call_user_func(array($this->instance, $name), $args);
return in_array($name, $this->fluentMethods) ? $this : $result;
}
}
class FluentFoo extends FluentWrapper
{
public function __construct(Foo $foo)
{
parent::__construct($foo, array('bar', 'baz'));
}
}
$foo = new FluentFoo(new Foo());
$bat = $foo
->bar()
->baz()
->bar()
->baz()
->bat();
print $bat."\n";