我所拥有的:Game
类(作为Laravel 5.5框架的一部分)
class Game implements GameInterface
{
private $currentGame;
public function __construct()
{
$this->currentGame = Game::where('status', true)->first();
}
public function getPlayersAmount()
{
if ($this->currentGame)
//fetch data & return it
else
return 0;
}
public function getPlayers()
{
if ($this->currentGame)
//fetch data & return it
else
return null;
}
public function getAllStats()
{
if ($this->currentGame)
//fetch data & return it
else
return null;
}
public function getTopScore()
{
if ($this->currentGame)
//fetch data & return it
else
return 0;
}
}
我的问题-if ($this->currentGame)
。我必须将其放置在每个方法中,以避免与口才相关的异常。
如何在每次方法调用之前进行此检查if ($this->currentGame)
,以避免代码重复?
__call()
不适用于公共方法。
我当前的课堂使用情况:
$game = new Game();
$game->getPlayers();
//and so on
答案 0 :(得分:1)
您可以将__call
用于此,您只需要将公共功能设为私有-然后为它们添加唯一的前缀,以确保它们是唯一可以公开调用的私有功能。
这里是一个例子。
class Game implements GameInterface
{
private $currentGame;
public function __construct()
{
$this->currentGame = Game::where('status', true)->first();
}
public function __call($method, $args)
{
if ($this->currentGame)
return call_user_func_array(array($this, 'public'.ucfirst($method)), $args);
else
return 0;
}
private function publicGetPlayersAmount()
{
//fetch data & return it
}
private function publicGetPlayers()
{
//fetch data & return it
}
private function publicGetAllStats()
{
//fetch data & return it
}
private function publicGetTopScore()
{
//fetch data & return it
}
}
答案 1 :(得分:1)
我认为您的方法没有任何意义。
如果您的Game
实例将取决于拥有一个currentGame
,并且如果currentGame
为假,则不可能创建该实例。
只需将验证放入构造函数中,如果无法实例化则抛出异常。
public function __construct()
{
$this->currentGame = Game::where('status', true)->first();
if (! $this->currentGame) {
throw new \Exception('Current game not available');
// probably better if you define your own exception class
}
}
然后,您只需检查它是否可以在实例化上正常运行,并且可以正常继续运行:
try {
$game = new Game();
$game->getPlayers();
}
catch (\Exception $e) {
// $game is not safe to use, do something about it.
}
答案 2 :(得分:0)
我认为可以使用tup2_sel1
和__call
call_user_func_array
只需将我们的函数实现为私有函数,其名称略有不同,然后让它们通过class Game implements GameInterface
{
private $currentGame;
public function __construct()
{
$this->currentGame = Game::where('status', true)->first();
}
public function __call($name, $arguments) {
$name = '_'.$name;
if ($this->currentGame && method_exists($this,$name)) return call_user_func_array(array($this, $name), $arguments);
return null;
}
private function _getPlayersAmount()
{
return "sthg";
}
private function _getPlayers()
{
return "sthg else";
}
private function _getAllStats()
{
return "also sthg else";
}
private function _getTopScore()
{
return "different one";
}
}
通过__call
进行调用。我们也可以使用call_user_func_array
,但是这样更动态。