Используйте свободный интерфейс с меньшим количеством кода

Как я могу уменьшить эти две строки

$foo = new Bar();
$baz = $foo->methodOne('param')->methodTwo('param');

в

$baz = Bar::methodOne('param')->methodTwo('param');

Я видел это специально в Laravel, и это хорошо читаемый код. Но я попробовал заставить это работать с некоторыми пользовательскими классами-помощниками. Такое чувство, что смешивание статических + нестатических функций, что пока сбивает с толку …

3

Решение

Более последовательной и понятной вещью было бы иметь статическую конструкторскую функцию, которая возвращает объект, а затем вызывать методы для него следующим образом:

$baz = Bar::create()->methodOne('param')->methodTwo('param');

Альтернативный синтаксис, чтобы сделать это непосредственно с тем, что у вас есть сейчас:

$baz = (new Bar())->methodOne('param')->methodTwo('param');

Но это не очень красиво …

2

Другие решения

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();
1

Для всех, кто проходит мимо: Laravel предлагает шаблон дизайна «Фасады» для достижения этого эффекта. http://laravel.com/docs/5.1/facades

Если вы хотите создать свой собственный вспомогательный класс, нужно сделать четыре вещи:

  1. Сам Хелпер Класс
  2. Привязка контейнера службы этого класса
  3. Фасадный класс «указывающий» на сервисный контейнер
  4. Псевдоним в app.php
0
По вопросам рекламы [email protected]