dismiss Step into the future! Click here to switch to the beta php.net site
downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

require> <declare
[edit] Last updated: Fri, 04 Oct 2013

view this page in

return

(PHP 4, PHP 5)

関数内で呼び出されると、return文は即座に その関数の実行を停止し、引数を関数の値として返します。 returnはまた、 eval()文や スクリプト自体の実行を終了させることが出来ます。

グローバルスコープで呼び出されると、現在実行中のスクリプトが終了 します。もしそのスクリプトが include もしくは require されたものである場合、制御は呼び出し元 のファイルに戻ります。また、そのスクリプトが include されたものである場合は、returnに与えられた引数 の値は include の戻り値となります。 returnがメインスクリプトで呼び出された場合は スクリプトが終了します。また、 設定ファイル auto_prepend_file 又は auto_append_fileオプションで指定されたスクリプトの場合も 同様にそのスクリプトが終了します。

さらに詳しい情報に関しては 返り値を参照してください。

注意: return は関数ではなく言語構造であるため、 引数を括弧で囲う必要があるのはないことに注意しましょう。 括弧で囲わずそのままにしておくのが一般的です。 またそのほうが PHP にかかる負荷も低くなります。

注意: パラメータを省略した場合は括弧も省略する必要があります。この場合の返り値は NULL です。 return に括弧をつけてコールしながら何も引数を指定しないと、 パースエラーとなります。

注意: 変数をリファレンスで返す場合は、決して引数を 括弧で囲ってはいけません。そのようにすると正しく動作しません。 return ($a); とすると、変数を返すのではなく ($a) を評価した結果を返すことになります (この場合は、もちろん $a の値です)。



require> <declare
[edit] Last updated: Fri, 04 Oct 2013
 
add a note add a note User Contributed Notes return - [12 notes]
up
3
Denis.Gorbachev
5 years ago
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".
up
4
MrLavender
3 years ago
@Radu

http://www.php.net/manual/en/language.operators.assignment.php

"The value of an assignment expression is the value assigned."

Note "the value assigned", not "the value assigned to".

The value assigned in the expression $a['e'] = 'sometxt' is 'sometxt', and that's what you're returning in function a().
up
1
andrew at neonsurge dot com
5 years ago
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.
up
2
Radu
3 years ago
When returning an array, you should declare the array before the return, else the result is not as you expect;

  Watch this example:

<?php
function a(){
    return
$a['e'] = 'sometxt';
}

function
b(){
   
$a['e']  = 'sometxt';
    return
$a;
}

function
c(){
    if(
is_array(a())){
        echo
'a is array';
    }else{
        echo
'a is NOT an array';
    }

    if(
is_array(b())){
        echo
'b is array';
    }else{
        echo
'b is NOT an array';
    }
}
?>

This will print:
a is NOT an array
b is array
up
0
list at regularoddity dot com
5 years ago
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
up
-1
pgl at yoyo dot org
4 years ago
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);
up
-2
mr dot xanadu at gmail dot com
5 years ago
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)
up
0
J.D. Grimes
3 months ago
Note that because PHP processes the file before running it, any functions defined in an included file will still be available, even if the file is not fully executed.

Example:

a.php
<?php
include 'b.php';

foo();
?>

b.php
<?php
return;

function
foo() {
     echo
'foo';
}
?>

Executing a.php will output "foo".
up
0
warhog at warhog dot net
7 years ago
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".
up
-1
fyrye
4 years ago
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
?>
up
-1
stoic
5 years ago
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()...
up
-4
Spacecat
6 years ago
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.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites