<?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";
Fatal error: Class FluentWrapper contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (SomethingFluent::bar, SomethingFluent::baz, SomethingFluent::bat) in /in/YUlRU on line 40
Process exited with code 255.
Fatal error: Class FluentWrapper contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (SomethingFluent::bar, SomethingFluent::baz, SomethingFluent::bat) in /in/YUlRU on line 56
Process exited with code 255.
Fatal error: Can't inherit abstract function Something::bar() (previously declared abstract in SomethingFluent) in /in/YUlRU on line 14
Process exited with code 255.
Output for 5.0.0 - 5.0.5
Parse error: parse error, unexpected T_ARRAY, expecting '&' or T_VARIABLE in /in/YUlRU on line 44
Process exited with code 255.
Output for 4.4.2 - 4.4.9
Parse error: syntax error, unexpected T_STRING in /in/YUlRU on line 8
Process exited with code 255.