PHP构造函数在方法内部调用方法时生成无限循环

时间:2016-08-23 13:06:15

标签: php laravel-5 eloquent infinite-loop

我在Laravel Eloquent Model中有一个构造函数。当我实例化Model时,当构造函数调用的方法调用另一个方法时,我得到了一个无限循环。

class ChessboardCell extends Model
{
    //...

    public function __construct()
    {
        parent::__construct();

        //...

        $this->putPieces('pawn', 'black', $blackPawns);

        //...
    }

    private function putPieces($piece, $player, $piecesArray)
    {
        //...

        if ($piece == 'pawn') {
            for ($file = 'a'; $file <= 'h'; $file++) {
                $pawnPiece = array_shift($piecesArray);
                $this->putPieceOnBoard($file, $rank, $pawnPiece);
            }
        }

        //...
    }

    public function putPieceOnBoard($file, $rank, $piece)
    {
        $chessboardCell = ChessboardCell::where('file', $file)
            ->where('rank', $rank)
            ->first();

        if (is_null($chessboardCell)) {
            // Gera excessão: não pegou a célula
        }
        $chessboardCell->current_piece = $piece->id;

        $chessboardCell->save();
    }

}

$this->putPieceOnBoard内调用putPieces function后获得无限循环。

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

首先请注意,这段代码会调用构造函数:

    $chessboardCell = ChessboardCell::where('file', $file)
        ->where('rank', $rank)
        ->first();

然后请注意,您正在putPieces()拨打__constructor(),而__constructor()则由putPieceOnBoard()调用putPieces(),依此类推,等等。

因此,本案例中的解决方案是单一责任(here)的神圣原则,您从构造函数中删除putPieces()并将其单独调用。

有关软件设计原则的更多信息,请查看this

答案 1 :(得分:0)

在构造函数中使用$blackPawns变量。但它来自哪里? 也许你应该像这样改变你的代码

public function __construct($blackPawns)
{
    parent::__construct();

    //...

    $this->putPieces('pawn', 'black', $blackPawns);

    //...
}