在调用任何公共类方法之前,检查类属性是否不为null

时间:2018-10-02 20:37:14

标签: php oop laravel-5.5

我所拥有的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

3 个答案:

答案 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,但是这样更动态。