当使用返回时,是否需要断开开关?

当使用 return时,我想知道是否需要在 switch函数中使用 break

function test($string)
{
switch($string)
{
case 'test1':
return 'Test 1: ' . $string;
case 'test2':
return 'Test 2: ' . $string;
}
}

我试过了,没有 break也能正常工作,但这安全吗?

80900 次浏览

不需要中断,返回将停止函数的执行。

(供参考: http://php.net/manual/en/function.return.php表示:

如果从函数内部调用,return ()语句会立即结束当前函数的执行

)

不,在 switch case语句中不需要 breakbreak实际上是可选的,但是要小心使用。

是的,你可以用 return代替 break..。

break是可选的,用于防止所有其他 case语句中出现“ 坠落”。因此,可以以类似的方式使用 return,就像 return结束函数执行一样。

另外,如果你的 case报表都是这样的:

case 'foo':
$result = find_result(...);
break;

switch语句之后,您只有 return $result,在每个 case中使用 return find_result(...);将使您的代码更具可读性。

最后,不要忘记添加 default案例。如果你认为你的代码将永远不会达到 default的情况下,那么你可以使用 assert函数,因为你永远不能肯定。

你不需要它,但是我强烈建议你在任何情况下使用它作为良好的练习。

不,这是不必要的,因为当关键字 return 被调用时,它将表明被调用的开关/大小写的特定函数已经结束。

Break 只是一个警告语句,用来限制对 switch 结构的控制,使其不能进入另一种情况... ... 例如,如果你有三个 case 语句,值是第一种情况,并且你使用的 case 没有任何 Break 结构,那么下面的所有情况都将被执行,尽管条件只对第一种情况满足... ..。 Return 可以执行同样的功能,所以如果你用 Return 代替 break 就不会有问题,因为 Return 会从 switch case 语句中夺走控制权,而这正是当时所需要的... ..。 希望能有所帮助。

return将控制权交还给调用方法,而 break跳转到开关块之后的第一条指令。

从 PHP8(2020年11月)开始,可以使用 match:

<?php


function test($string) {
return match ($string) {
'test1' => 'Test 1: ',
'test2' => 'Test 2: '
} . $string;
}

尽管在这种情况下,您可以只使用一个数组:

<?php


function test($string) {
return [
'test1' => 'Test 1: ',
'test2' => 'Test 2: '
][$string] . $string;
}

Https://php.net/control-structures.match

没有。Return 直接跳回到函数调用返回它之后的值,并忽略执行的 return 语句之后的所有内容(在函数中)。因此 return 本身可以作为函数的 break 语句,不需要进一步的 break。这是我的例子。

switch (ActiveSt)
{
case 0:
obj.Authuser(Session["UserId"].ToString());
obj.auditlog(UserID, MachineName, IpAdd, OsUser, Des, SysType, Screen, Fncname);
Session["UserId"] = null;
Response.Write("<script>alert('User authorized successfully');window.location ='frmUserPendingList.aspx';</script>");
return;
case 7:
obj.Authuser(Session["UserId"].ToString());
obj.auditlog(IssueId, MachineName, IpAdd, OsUser, Des, SysType, Screen, Fncname);
Session["UserId"] = null;
Response.Write("<script>alert('User authorized successfully');window.location ='frmUserPendingList.aspx';</script>");
return;
case 1:
Response.Write("<script>alert('User already authorized!');</script>");
errorHandle("User Already Authorized!");
return;
case 5:
Response.Write("<script>alert('User already rejected!');</script>");
errorHandle("User already rejected!");
return;
}