web-dev-qa-db-ja.com

`return;`とnoreturnの違いは何ですか?

違いはありますか?

function someMethod( $someArg ) {
  // some code
  return;
}

そして

function someMethod( $someArg ) {
  // some code
  // no return
}

どちらも「戻り値」としてNULLを持っています。違いはありますか?何かPHP内部的に?パフォーマンス?スピード?

編集
Zendフレームワーク( このビデオでは )ではreturn;を使用しているので、私にはばかげているように見えました。ただし、Zendフレームワークの背後にいる人々は自分のPHPを知っていると思うでしょう...

35
Rudie

phpコード

<?php

function a() {
   echo 1;
   return;
}

function b() {
   echo 2;
}

生成されたバイトコード

.FUNCTION a
        ECHO                     1
        RETURN                   NULL
        RETURN                   NULL
        HANDLE_EXCEPTION         
.END FUNCTION

.FUNCTION b
        ECHO                     2
        RETURN                   NULL
        HANDLE_EXCEPTION         
.END FUNCTION

したがって、明示的なreturnステートメントは1つの追加のRETURN命令を生成します。それ以外は違いはありません。

40
user187291

私の知る限り、違いはありません。

空のreturn;は主に、if/elseから抜け出すためにあり、whileまたはforループは何も返さない。

11
Gamlor

機能的には違いはありませんが、関数(リターン)に明確な終了ポイントがあるのは常に素晴らしいことです。コンピュータサイエンスのいくつかの学校は、すべての機能と方法が正確に1つ、そして1つだけの出口を持つべきであると考えています。

将来、戻り値を追加する必要がある場合、空の戻り値を含めると、コードですでに選択されている明らかなポイントがあります。

しかし、私が言ったように、機能的な観点からはあまり違いはありません。

4
GordonM

あなたの例では、違いはありません。

ただし、returnは関数を終了するため、returnステートメントの後のコードをスキップするオプションがあります(これが目的です)。

あなたの例では、returnを見たいかどうかは、個人的な好みです。

さらに、Perlのような一部の言語では、最後の式は「暗黙的に」戻り値であるため、「return」を使用する必要さえありません。 (ただし、これはC++などの他の言語では機能しません。)

sub foo {
  return 12;
}

sub foo2 {
  12;  # same thing
}
3
charley

大きな違いはありません。return;を使用するだけで、関数呼び出しを早期に終了できます。どちらもNULLを返しますが、これはワークフロー専用です。

1
qJake

私は専門家ではありませんが、ごくわずかな違いがあれば言うでしょう。リターンを置くことによってあなたがかみ傷を使い果たしたと主張することができます。またはfalseを返します。関数の終わりに。

通常、私は次のようなものでリターンを使用します

return true;

または

return $var;

何も返したくない場合やfalseを返したい場合はreturnを使用しません

1
mcgrailm

PHPやPythonなどの言語では実際の違いはありません。return;を使用して、関数を途中で終了することができます。

ただし、選択するプログラミング言語がC/C++、Java、C#の場合は違いがあり、戻り値がない場合はvoidを意味します。

1
Pwnna

非常に興味深いことに(私は思う)、戻り値の型を持つことは大きな違いを生みます。 3種類の戻り値nullは、3つの異なるエラーをスローします。

function foo() : string {
  // return nothing

  // TypeError exception: Return value of foo() must be of the type string, none returned
}

function foo() : string {
  return;

  // Fatal error: A function with return type must return a value
}

function foo() : string {
  return null;

  // TypeError exception: Return value of foo() must be of the type string, null returned
}

すべてのエラーは実行時であり、すべての戻り値は技術的にはnullであるため、私は推測していませんでした。

0
Rudie

関数の最後のステートメントとして「空の」returnを使用して、関数が値を返すことを期待されていないことをわかりやすく思い出させることがあります。

class foo {
  var $name;

  public function bar($x) {
    $this->name = $x;
    return;
  }
}

ADAには、proceduresfunctionsがあります。最初のものはデータを返さず、いくつかのステートメントを実行するだけです。関数はデータを返すことができます。

したがって、空のreturnは「これはプロシージャです」のようになります。

0
Julio

returnが呼び出されるとすぐに、関数呼び出しは終了します。それは休憩のように機能します。したがって、リターンが途中の場合、関数の残りの部分が実行されないため、パフォーマンスが向上します。

残りの部分については、暗黙的なリターンの代わりに明示的なリターンを使用する方が(読みやすさの点で)しばしば優れています。関数でreturnを保持すると、その関数の呼び出しで戻り値が期待される可能性があることがわかります。

0
gnur

returnは関数を中断/終了します(switch/caseのようにbreakを考えてください)

function someMethod( $someArg ) {
    if(condition) {
        return; // will exit function
    }

    // could be more code
}
0
Phill Pafford