如何使用try catch创建可重用的for循环?

时间:2018-05-26 17:48:03

标签: php for-loop

这是我使用的代码:

for ($i=0; $i < 2; $i++) {
    try {
        User::create([
            'name' => 'username'
        ]);
        break;
    } catch (\Illuminate\Database\QueryException $e) {
        if ($i == 1) {
            throw $e;
        }
    }
}

但我想重复使用此代码仅替换try循环中的数据,例如:

for ($i=0; $i < 2; $i++) {
    try {

        // replace something here
        // all rest of the code should be ignore and resuable

        break;
    } catch (\Illuminate\Database\QueryException $e) {
        if ($i == 1) {
            throw $e;
        }
    }
}

它可能是这样的用例:

loop(function() {
    User::create([
        'name' => 'user name'
    ]);
})

任何解决方案?

2 个答案:

答案 0 :(得分:0)

从PHP 5.3.0开始,您可以将函数作为函数的参数传递。所以你可以把你的for循环放到某个函数中,当你调用它时,传递其他函数(你要改变的代码片段)。

例如(未经测试):

function loopingFucntion($someOtherFunction){
    for ($i=0; $i < 2; $i++) {
        try {
    $someOtherFunction();
            break;
        } catch (\Illuminate\Database\QueryException $e) {
            if ($i == 1) {
                throw $e;
            }
        }
    }
}

//and when you wanna pass your new code you can call it like this
loopingFucntion(function(){
    //your new code
});

答案 1 :(得分:0)

您可以通过将匿名函数作为参数传递然后在for循环中运行来完成您所说的内容。顶部代码将进入函数

function loop($func)
{
    for ($i=0; $i < 2; $i++)
    {
        try
        {
            $func();
        }
        catch (\Illuminate\Database\QueryException $e)
        {
            if ($i == 1)
                throw $e;
        }
    }
}

loop(function()
{
    echo "LOOPING" . "\n";
});

这两次输出“LOOPING”。