Just to clear things up, if using return on a global scope it will end EXECUTION but NOT PROCESSING.
for example:
file a.php
<?php
if(defined("A")) return;
define("A", true);
echo "Hello";
?>
file b.php
<?php
include("a.php");
include("a.php");
?>
will output "Hello" only once.
but if file a.php is
<?php
if(defined("A")) return;
define("A", true);
function foo(){
}
?>
running file b.php will produce error:
Fatal Error: Cannot redeclare foo()...
return
関数内で呼び出されると、return()文は即座に その関数の実行を停止し、引数を関数の値として返します。 return()はまた、eval()文や スクリプト自体の実行を終了させることが出来ます。
グローバルスコープで呼び出されると、現在実行中のスクリプトが終了 します。もしそのスクリプトがinclude()もしくは require()されたものである場合、制御は呼び出し元 のファイルに戻ります。また、そのスクリプトがinclude() されたものである場合は、return()に与えられた引数 の値はinclude()の戻り値となります。 return()がメインスクリプトで呼び出された場合は スクリプトが終了します。また、 設定ファイルの auto_prepend_file 又は auto_append_fileオプションで指定されたスクリプトの場合も 同様にそのスクリプトが終了します。
さらに詳しい情報に関しては 返り値を参照してください。
注意: return() は関数ではなく言語構造であるため、 引数を括弧で囲う必要があるのはないことに注意しましょう。 括弧で囲わずそのままにしておくのが一般的です。 またそのほうが PHP にかかる負荷も低くなります。
注意: 変数をリファレンスで返す場合は、決して引数を 括弧で囲うべきではありません。そのようにすると正しく動作しません。 return ($a); とすると、変数を返すのではなく ($a) を評価した結果を返すことになります (この場合は、もちろん $a の値です)。
return
06-Jun-2008 03:21
02-Dec-2007 11:06
direct true 0.59850406646729
direct false 0.62642693519592
indirect true 0.75077891349792
indirect false 0.73496103286743
It is generally more true, because indirect method implies creating additional variable and assigning a value to it.
But, you know, "results may vary".
12-Oct-2007 10:56
I was wondering what was quicker:
- return a boolean as soon I know it's value ('direct') or
- save the boolean in a variable and return it at the function's end.
<?php
$times = 50000;
function return_direct ($boolean)
{
if ($boolean == true)
{
return true;
}
return false;
}
function return_indirect ($boolean)
{
$return = false;
if ($boolean == true)
{
$return = true;
}
return $return;
}
/* Direct, return true */
$time_start = microtime(true);
for ($i = 1; $i <= $times; $i++)
{
return_direct(true);
}
$time_end = microtime(true);
$time_direct_true = $time_end - $time_start;
/* Direct, return false */
$time_start = microtime(true);
for ($i = 1; $i <= $times; $i++)
{
return_direct(false);
}
$time_end = microtime(true);
$time_direct_false = $time_end - $time_start;
/* Indirect, return true */
$time_start = microtime(true);
for ($i = 1; $i <= $times; $i++)
{
return_indirect(true);
}
$time_end = microtime(true);
$time_indirect_true = $time_end - $time_start;
/* Direct, return false */
$time_start = microtime(true);
for ($i = 1; $i <= $times; $i++)
{
return_indirect(false);
}
$time_end = microtime(true);
$time_indirect_false = $time_end - $time_start;
echo "<pre>";
echo "direct true\t" . $time_direct_true;
echo "\ndirect false\t" . $time_direct_false;
echo "\nindirect true\t" . $time_indirect_true;
echo "\nindirect false\t" . $time_indirect_false;
echo "<pre>";
?>
Representative results:
direct true 0.163973093033
direct false 0.1270840168
indirect true 0.0733940601349
indirect false 0.0742440223694
Conclusion: saving the result in a variable appears to be faster. (Please note that my test functions are very simple, maybe it's slower on longer functions)
25-Jul-2007 03:13
regardez this code:
print pewt( "hello!" );
function pewt( $arg )
{
include( "some_code.inc" );
}
some_code.inc:
return strtoupper( $arg );
.. after much hair pulling, discovered why nothing was being returned by the "some_code.inc" code in the function .. the return simply returns the result TO the function (giving the include function a value), not to the CALLING (print pewt). This works:
print pewt( "hello!" );
function pewt( $arg )
{
return include( "some_code.inc" );
}
So, RETURN works relative to block it is executed within.
18-Dec-2005 09:28
for those of you who think that using return in a script is the same as using exit note that: using return just exits the execution of the current script, exit the whole execution.
look at that example:
a.php
<?php
include("b.php");
echo "a";
?>
b.php
<?php
echo "b";
return;
?>
(executing a.php:) will echo "ba".
whereas (b.php modified):
a.php
<?php
include("b.php");
echo "a";
?>
b.php
<?php
echo "b";
exit;
?>
(executing a.php:) will echo "b".
