Как я могу уменьшить эти две строки
$foo = new Bar();
$baz = $foo->methodOne('param')->methodTwo('param');
в
$baz = Bar::methodOne('param')->methodTwo('param');
Я видел это специально в Laravel, и это хорошо читаемый код. Но я попробовал заставить это работать с некоторыми пользовательскими классами-помощниками. Такое чувство, что смешивание статических + нестатических функций, что пока сбивает с толку …
Более последовательной и понятной вещью было бы иметь статическую конструкторскую функцию, которая возвращает объект, а затем вызывать методы для него следующим образом:
$baz = Bar::create()->methodOne('param')->methodTwo('param');
Альтернативный синтаксис, чтобы сделать это непосредственно с тем, что у вас есть сейчас:
$baz = (new Bar())->methodOne('param')->methodTwo('param');
Но это не очень красиво …
Laravel делает это следующим образом
в: vendor/laravel/framework/src/Illuminate/Database/Capsule
/**
* Dynamically pass methods to the default connection.
*
* @param string $method
* @param array $parameters
* @return mixed
*/
public static function __callStatic($method, $parameters)
{
return call_user_func_array(array(static::connection(), $method), $parameters);
}
/**
* Get a connection instance from the global manager.
*
* @param string $connection
* @return \Illuminate\Database\Connection
*/
public static function connection($connection = null)
{
return static::$instance->getConnection($connection);
}
От PHPDoc:
__callStatic () запускается при вызове недоступных методов в статическом контексте.
Я думаю, вы можете упростить это для своего класса:
class Bar{
public static function __callStatic($method, $parameters)
{
return call_user_func_array(array(new Bar(), $method), $parameters);
}
public function hello(){
echo "hello";
}
}
Bar::hello();
Для всех, кто проходит мимо: Laravel предлагает шаблон дизайна «Фасады» для достижения этого эффекта. http://laravel.com/docs/5.1/facades
Если вы хотите создать свой собственный вспомогательный класс, нужно сделать четыре вещи: