PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

require> <declare
Last updated: Fri, 27 Jun 2008

view this page in

return

Ако се извиква от функция, инструкцията return() незабавно завършва изпълнението й и връща аргумента си като стойност от извикването на функцията. return() ще прекъсне също и изпълнението на конструкцията eval() или скриптов файл.

Ако се извиква от глобалния обхват, тогава изпълнението на текущия скрипт се прекратява. Ако текущият скриптов файл е бил include()-нат (включен) или require()-нат (изискан), тогава контролът се връща обратно на извикващия файл. Освен това, ако текущият скрипт е бил include()-нат, тогава стойността подадена на return() ще бъде върната като стойност от извикването на include(). Ако return() се извика от главния скрипт, изпълнението на скрипта се прекратява. Ако текущият скрипт е бил описан в конфигурационните опции auto_prepend_file или auto_append_file в php.ini, тогава изпълнението на този скрипт се прекратява.

За повече информация, вж. Връщане на стойности.

Забележка: Забележете, че тъй като return() е езикова конструкция, а не функция, заграждащите скоби не са необходими. Всеприето е скобите да се изпускат и всъщност дори е по-добре да го правите, тъй като в този случай PHP има по-малко работа за вършене.

Забележка: В никакъв случай не трябва да използвате скоби около връщаната променлива, когато се връща по референция, тъй като това няма да работи. По референция можете да връщате единствено променлива, но не и резултат от израз. Когато използвате return ($a);, тогава вие не връщате променлива, а резултата от израза ($a) (който, разбира се, е стойността на $a).



require> <declare
Last updated: Fri, 27 Jun 2008
 
add a note add a note User Contributed Notes
return
list at regularoddity dot com
08-Oct-2008 12: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
andrew at neonsurge dot com
15-Aug-2008 04: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.
stoic
06-Jun-2008 09: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()...
Denis.Gorbachev
03-Dec-2007 06: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".
mr dot xanadu at gmail dot com
12-Oct-2007 04: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)
Spacecat
25-Jul-2007 09: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.
warhog at warhog dot net
19-Dec-2005 04: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".

require> <declare
Last updated: Fri, 27 Jun 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites