使用较少代码的Fluent界面

时间:2014-10-18 16:24:47

标签: php oop laravel fluent-interface

如何减少这两行

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

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

我在Laravel中看过这个特别好的代码。但我坚持让它与一些自定义Helper-Class一起使用。感觉就像混合静态+非静态功能一样令人困惑......

3 个答案:

答案 0 :(得分:2)

Laravel以下列方式做到了

in: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 :(得分:2)

更一致和自我解释的事情是使用一个返回对象的静态构造函数,然后像这样调用它上面的方法:

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

直接使用现有内容执行此操作的替代语法是:

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

但那不是很漂亮......

答案 2 :(得分:0)

对于路过的每个人:Laravel提供了一种名为Facades的设计模式来实现这种效果。 http://laravel.com/docs/5.1/facades

如果你想建立自己的Helper-Class,需要做四件事:

  1. 助手班级本身
  2. 该类的服务容器绑定
  3. Facade Class“指向”Service Container
  4. app.php中的别名