#php
#php
Вопрос:
Мне было интересно, нужно ли мне использовать break
в switch
функции, когда return
используется.
function test($string)
{
switch($string)
{
case 'test1':
return 'Test 1: ' . $string;
case 'test2':
return 'Test 2: ' . $string;
}
}
Я пробовал это, и это прекрасно работает без break
. Но безопасно ли это?
Комментарии:
1. что произойдет, если $string=’testx’;
Ответ №1:
Да, вы можете использовать return
вместо break
…
break
является необязательным и используется для предотвращения «падения» во всех других case
операторах. Так return
можно использовать аналогичным образом, поскольку return
выполнение функции заканчивается.
Кроме того, если все ваши case
инструкции похожи на это:
case 'foo':
$result = find_result(...);
break;
И после switch
инструкции, которую вы только что получили return $result
, использование return find_result(...);
в каждом case
из них сделает ваш код намного более читаемым.
Наконец, не забудьте добавить default
регистр. Если вы думаете, что ваш код никогда не достигнет default
регистра, тогда вы могли бы использовать assert
функцию, потому что вы никогда не можете быть уверены.
Комментарии:
1. Спасибо Лужин, это то, о чем я подумал.
Ответ №2:
Вам не нужен перерыв, возврат останавливает выполнение функции.
(для справки:http://php.net/manual/en/function.return.php говорит:
Если вызывается из функции, оператор return() немедленно завершает выполнение текущей функции
)
Ответ №3:
Нет, в этом нет необходимости, потому что при вызове ключевого слова return это будет указывать на то, что конкретная функция, для которой был вызван переключатель / case, завершила работу.
Ответ №4:
Нет, вам не нужен оператор break
in switch case
. break
На самом деле необязательно, но используйте с осторожностью.
Ответ №5:
Вам это не нужно, но я бы настоятельно рекомендовал использовать это в любом случае в качестве хорошей практики.
Комментарии:
1. нет смысла, поскольку return явно существует сам по себе при выполнении =) Чем меньше кода, тем лучше.
2. Меньше кода! = лучше. Идите играть в code golf. Я бы предпочел иметь читаемый, явный код, чем чрезмерно оптимизированный код, чтобы он мог быть в одной строке в ущерб удобочитаемости и понятности.
3. Вы можете аргументировать это обоими способами. Некоторые компиляторы предупреждают о неисполняемом коде после возврата в switch, некоторые нет. Это личное предпочтение, и для меня, по крайней мере, оно зависит от того, сколько раз я был укушен падением через переключатель, мне нравится видеть перерыв.
Ответ №6:
return
возвращает управление вызывающему методу, тогда как break
переходит к первой инструкции после блока переключения.
Ответ №7:
Break — это просто предостерегающее заявление, используемое для ограничения перехода управления структурой switch в другой регистр … например, если у вас есть три оператора case и значение указано для первого регистра, и вы использовали case без какой-либо структуры break, тогда все следующие случаи будут выполнены, несмотря на то, что условие выполняется только для первого случая… Return может выполнять функцию asme, поэтому не будет проблем, если вы используете return вместо break, потому что return отнимет управление у оператора switch case, который необходим в данный момент …… надеюсь, это поможет….
Ответ №8:
Начиная с PHP 8 (ноябрь 2020), вы можете использовать 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;
}
Ответ №9:
Нет. return возвращается непосредственно к вызову функции, возвращая значение после него, и все (в функции), что после выполненного оператора return, игнорируется. Таким образом, return сам по себе может действовать как оператор 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;
}