NB: using return to exit a command-line script will not use the return value as the script's return value. To do that, you need to use, eg, exit(1);
return
return()문이 함수안에서 호출된다면, 현재 함수의 수행을 즉시 끝내고, 함수 호출 결과값으로 return의 인수값을 넘겨준다. return()문은 eval()함수나 스크립트 파일의 수행을 종료시킨다.
전역 유효범위에서 호출된다면, 현재 스크립트 파일의 수행을 끝마친다. 현재 스크립트가 include()나 require()되었다면, 호출하고 있는 파일로 제어를 넘긴다. 더욱이, 현재 스크립트 파일이 include()되어있는것이면, return()에 주어지는 값은 include()호출에 대한 값으로 넘겨줄것이다. return()이 주 스크립트 파일에서 호출되면, 스크립트의 수행이 종료된다. 현재 스크립트 파일이 php.ini의 auto_prepend_file이나 auto_append_file 옵션에 의해 명명되었다면, 스크립트 파일의 수행은 중단된다.
좀더 자세한 정보는 Returning values 을 참고하세요.
Note: return()은 함수가 아닌 언어 구조이기 때문에, 인수를 괄호로 쌀 필요가 없습니다. 괄호가 없는 것이 일반적으로, PHP가 더 적은 일을 하게 합니다.
Note: 반환값이 참조로 반환될 때는 절대로 괄호를 사용하면 안되며, 동작하지 않습니다. 참조는 변수만 반환할 수 있으며, 구문 결과는 반환할 수 없습니다. return ($a);를 사용한다면, 변수를 반환하지 않고 ($a) 표현의 반환값을 반환합니다. (물론, $a의 값입니다)
return
01-Aug-2009 12:23
31-Jul-2009 07:25
A side note when you return a conditional value the variable type will inherit its type of Boolean
For example
<?php
function foo($SQL){
$conTemp = new mysqli("locahost", "root", "", "");
$conTemp->select_db("MyDB");
return $conTemp->query($SQL) or die("Query Failed!");
}
$result = foo("SELECT UserName FROM Users LIMIT 1");
echo gettype($result); //returns Boolean instead of object or die
?>
Instead be explicit with your function like so
<?php
function foo($SQL){
$conTemp = new mysqli("locahost", "root", "", "");
$conTemp->select_db("MyDB");
if(!$result = $conTemp->query($SQL)){
return die("Query Failed");
}
return $result;
}
$result = foo("SELECT UserName FROM Users LIMIT 1");
echo gettype($result); //Now will return Object or die
?>
08-Oct-2008 01:26
As obvious as it may seem, it might still be useful to point out that return called without any value returns null.
<?php
function test() {
return;
}
print gettype(test()) . "\n";
print (test()?'true':'false') . "\n";
print (!test()?'true':'false') . "\n";
print (test() === false?'true':'false') . "\n";
?>
This returns:
NULL
false
true
false
15-Aug-2008 05:40
Response to stoic's message below...
I believe the way you've explained this for people may be a bit confusing, and your verbiage is incorrect. Your script below is technically calling return from a global scope, but as it says right after that in the description above... "If the current script file was include()ed or require()ed, then control is passed back to the calling file". You are in a included file. Just making sure that is clear.
Now, the way php works is before it executes actual code it does what you call "processing" is really just a syntax check. It does this every time per-file that is included before executing that file. This is a GOOD feature, as it makes sure not to run any part of non-functional code. What your example might have also said... is that in doing this syntax check it does not execute code, merely runs through your file (or include) checking for syntax errors before execution. To show that, you should put the echo "b"; and echo "a"; at the start of each file. This will show that "b" is echoed once, and then "a" is echoed only once, because the first time it syntax checked a.php, it was ok. But the second time the syntax check failed and thus it was not executed again and terminated execution of the application due to a syntax error.
Just something to help clarify what you have stated in your comments.
06-Jun-2008 10:21
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()...
03-Dec-2007 07: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 05: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 10: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.
19-Dec-2005 05: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".
