PhpStorm 中是否存在逻辑问题或错误?

是否有我没有看到的逻辑错误/案例?

我正在使用 PHP 语言级别 7.1 和 CLI Interpreter PHP 7.1.8 的 PhpStorm 2017.1

我尝试了以下情况:

  1. User有和有carrinho(DB)和没有carrinho_idrequest

  2. User没有和有carrinho(DB)和没有carrinho_idrequest

  3. carrinho_idrequest没有_user

  4. carrinho_id有错user(not logged)

$user = Auth::guard('api')->user();

if(!(isset($user) && ($carrinho = $user->getCarrinho()) != null)){

    if(!isset($data['carrinho_id']) || (($carrinho = Carrinho::find($data['carrinho_id'])) == null) || ($carrinho->usuario_id != null))

        $carrinho = Carrinho::salvar([]);

    if(isset($user))

        $carrinho->setUsuario($user->id);

}


if($carrinho->addProduto($data)) //"$carrinho" Variable might have not been defined

    return response()->json([

        'carrinho_id' => $carrinho->id

    ]);

return response()->json(['msg' => "O produto já está no seu carrinho"],422);

两种可能的情况

$user存在

if(!(true && ($carrinho = $user->getCarrinho()) != null))

2 两种可能的路径

1 - 有$carrinho

if(!(true && true)) -> !(true && true) -> !(true) -> false -> skip if and load the $carrinho from the user

2 - 没有$carrinho

if(!(true && false)) -> !(true && false) -> !(false) -> true -> Go inside the if and define the $carrinho

第一个里面的代码if总是有一个$carrinho

问题出在第一个if。我怎么知道?因为如果我这样做,警告就会消失。

if(!(isset($user) && ($carrinho = $user->getCarrinho()) != null)){

    if(!isset($data['carrinho_id']) || (($carrinho = Carrinho::find($data['carrinho_id'])) == null) || ($carrinho->usuario_id != null))

        $carrinho = Carrinho::salvar([]);

    if(isset($user))

        $carrinho->setUsuario($user->id);

}else{

    $carrinho = Carrinho::salvar([]);

}


潇潇雨雨
浏览 127回答 3
3回答

手掌心

这段代码非常难以阅读,因为您将副作用(赋值)与涉及多个布尔运算符的复杂条件结合在一起。让我们试着把它写成一组离散的操作:// First condition to be evaluated is isset($user)$haveUser = isset($user);// If that condition is false, the && will lazily skip the next partif ( $haveUser ) {    // Now we conditionally assign $carrinho ...    $carrinho = $user->getCarrinho();    // ... and test its value    $haveCarrinho = ($carrinho != null);}// Having done all that, we combine the two conditions$haveBoth = $haveUser && $haveCarrinho;// Now we invert that condition for our if statementif ( ! $haveBoth ) {    // We know here that $carrinho has either never been set (because $haveUser was false) ...    //   ... or it was null (setting $haveCarrinho to false)    // Line 3 - another if statement to unpack    $haveIdInData = isset($data['carrinho_id']);    // If that condition is false, the || will shortcut    if ( ! $haveIdInData ) {        $carrinho = Carrinho::salvar([]);    }    // If we don't short-cut, the rest of line 3 runs    else {        // Try finding it by the ID in $data        $carrinho = Carrinho::find($data['carrinho_id']);        // If it's null, we short-cut at the next ||        if ($carrinho == null) {            $carrinho = Carrinho::salvar([]);        }        else {            // Else we make the next check            if ($carrinho->usuario_id != null) {                $carrinho = Carrinho::salvar([]);            }        }    }    // On to line 4! Reusing our condition from above, since the state of $user won't have changed    if ( $haveUser ) {        // This will give a horrible error if $carrinho is null        $carrinho->setUsuario($user->id);    }}// We've reached line 5, and expect $carrinho to be set, but we have no guarantee of that at all!4 行代码就包含了很多逻辑!稍微整理一下,没有让它像原来的那样神秘,我认为这是等价的:$carrinho = null;if ( isset($user) ) {    // Now we conditionally assign $carrinho ...    $carrinho = $user->getCarrinho();}if ( $carrinho == null ) {    if ( isset($data['carrinho_id']) ) {        $carrinho = Carrinho::find($data['carrinho_id']);        if ($carrinho == null || $carrinho->usuario_id != null) {            $carrinho = Carrinho::salvar([]);        }    }    if(isset($user)) {        $carrinho->setUsuario($user->id);    }}现在我们可以看到可能的意图:该Carrinho::salvar行应该是任何其他未定义状态的后备,而不是嵌套在其他条件中。稍加努力,我们就可以完全消除嵌套条件,从而提供更具可读性的内容,如下所示:// Initialise variables to a known state$carrinho = null;$loadedFromUser = false;// Try on user objectif ( isset($user) ) {    $carrinho = $user->getCarrinho();    $loadedFromUser = ($carrinho != null);}// Not found? Try looking up by input dataif ( $carrinho == null && isset($data['carrinho_id']) ) {    $carrinho = Carrinho::find($data['carrinho_id']);}// Discard if it already has a user ID, but wasn't loaded from userif (!$loadedFromUser && $carrinho != null && $carrinho->usuario_id != null) {    $carrinho = null;}// Still not found? Create an empty oneif ($carrinho == null) {    $carrinho = Carrinho::salvar([]);}// Now we know we have an object some way or another, and can assign a user ID to itif(isset($user) && !$loadedFromUser) {    $carrinho->setUsuario($user->id);}其中一些条件可能并不完全符合预期,但通过将它们分开,我们现在可以更轻松地遵循逻辑并进行适当的更改。

慕的地6264312

您的代码在执行过程中可能有问题,PHPStorm 对此进行了说明。在某些情况下你不会有$carrinho对象,例如,如果$user变量存在if(!(isset($user) && ($carrinho = $user->getCarrinho()) != null)){    if(!isset($data['carrinho_id']) || (($carrinho = Carrinho::find($data['carrinho_id'])) == null) || ($carrinho->usuario_id != null))        $carrinho = Carrinho::salvar([]);    if(isset($user))        $carrinho->setUsuario($user->id);}并且代码$carrinho->addProduto($data)将失败。你需要修复它。例如,您可以将代码移动到条件块中if(!(isset($user) && ($carrinho = $user->getCarrinho()) != null)){    if(!isset($data['carrinho_id']) || (($carrinho = Carrinho::find($data['carrinho_id'])) == null) || ($carrinho->usuario_id != null)) {        $carrinho = Carrinho::salvar([]);    }    if(isset($user)) {        carrinho->setUsuario($user->id);    }    if($carrinho->addProduto($data)) {        return response()->json([            'carrinho_id' => $carrinho->id        ]);   }}return response()->json(['msg' => "O produto já está no seu carrinho"],422);

慕丝7291255

经过一些质疑和研究,我得出的结论是,硬代码对任何人都没有帮助,在团队合作和项目发展方面。我决定通过以下方式实现代码:$user = Auth::guard('api')->user();$hasUser = isset($user);if($hasUser)    $carrinho = $user->getCarrinho();if(!isset($carrinho)){    if(isset($data['carrinho_id']))        $carrinho = Carrinho::find($data['carrinho_id']);    if(!isset($carrinho) || $carrinho->usuario_id != null)        $carrinho = Carrinho::salvar([]);    if($hasUser)        $carrinho->setUsuario($user->id);}if($carrinho->addProduto($data))    return response()->json([        'carrinho_id' => $carrinho->id    ]);return response()->json(['msg' => "O produto já está no seu carrinho"],422);我不会接受这个答案,因为我仍然不相信代码有错误,因为没有人能找到任何错误。但我将把它留在这里以表明硬代码没有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP