Нужен ли вам перерыв в переключении, когда используется return?

#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;
}
  

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

Ответ №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;
            }