如何减少这两行
$foo = new Bar();
$baz = $foo->methodOne('param')->methodTwo('param');
到
$baz = Bar::methodOne('param')->methodTwo('param');
我在Laravel中看过这个特别好的代码。但我坚持让它与一些自定义Helper-Class一起使用。感觉就像混合静态+非静态功能一样令人困惑......
答案 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,需要做四件事: