ConFoo Montreal 2017 Calling for Papers

return

(PHP 4, PHP 5, PHP 7)

A declaração return retorna o controle do programa para o módulo que o chamou. A execução continuará na expressão seguinte à invocação do módulo.

Se chamada dentro de uma função, a declaração return terminará imediatamente sua execução, e retornará seus argumentos como valor à chamada da função. A declaração return também terminar a execução de uma declaração eval() ou um arquivo de script.

Se chamada no escopo global, a execução do script corrente é finalizada. Se o arquivo de script corrente for incluído ou requerido com as funções include ou or require, o controle é passado de volta ao script que está chamando. Além disso, se o script corrente foi incluído com a função include, o valor informado ao return será retornado como o valor da chamada de include. Se um return for chamado de dentro do script principal, sua execução será finalizada. Se o script corrente for mencionado nas opções de configuração auto_prepend_file ou auto_append_file php.ini, a execução do script será finalizada.

For more information, see Returning values.

Nota: Note que, como return é um construtor de linguagem e não uma função, is parênteses que envolvem seus argumentos não são exigidos. É comum omiti-los, e na verdade, deve-se fazer, já que o PHP terá menos trabalho a ser feito, neste caso.

Nota: Se nenhum parâmentro for informado, e os parênteses omitidos, NULL será retornado. Chamar return com parênteses, mas sem argumentos resultará em um erro de interpretação.

Nota: Nunca deve-se utilizar parênteses em torno de sua variável de retorno ao retornar por referência, por que isso não funcionará. Pode-se retornar variáveis por referência, mas não o resultado de uma declaração. Se utilizar return ($a); não se estará retornando uma variável, mas sim o resultado da expressão ($a) (que, é claro, é o valor de $a).

add a note add a note

User Contributed Notes 8 notes

up
86
warhog at warhog dot net
10 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
20
Russell Weed
1 year ago
Following up on Tom and warhog's comments regarding using return in global scope, here is another reason not to do it:

For command line scripts, the return statement will NOT return a status to the OS!

<?php
if ($somethingBad)
   return
42; // This will not work! You'll get 0 back instead!
else
   return
0;
?>

Instead, you must use exit(): http://php.net/exit

<?php
if ($somethingBad)
   exit(
42); // OS will receive (int) 42 as the return code
else // everything is fine
  
exit(0);
?>
up
39
Tom
2 years ago
Keep in mind that even if PHP allows you to use "return" in the global scope it is very bad design to do so.

Using the return statement in the global scope encourages programmers to use files like functions and treat the include-statement like a function call. Where they initialize the file's "parameters" by setting variables in the global scope and reading them in the included file.

Like so: (WARNING! This code was done by professionals in a controlled environment. Do NOT try this at home!)
<?php
$parameter1
= "foo";
$parameter2 = "bar";
$result = include "voodoo.php";
?>

Where "voodoo.php" may be something like:
<?php
return $parameter1 . " " . $parameter2;
?>

This is one of the worst designs you can implement since there is no function head, no way to understand where $parameter1 and $parameter2 come from by just looking at "voodoo". No explanation in the calling file as of what $parameter1 and -2 are doing or why they are even there. If the names of the parameters ever change in "voodoo" it will break the calling file. No IDE will properly support this very poor "design". And I won't even start on the security issues!

If you find yourself in a situation where a return-statement in global scope is the answer to your problem, then maybe you are asking the wrong questions. Actually you may be better off using a function and throwing an exception where needed.

Files are NOT functions. They should NOT be treated as such and under no circumstances should they "return" anything at all.

Remember: Every time you abuse a return statement God kills a kitten and makes sure you are reborn as a mouse!
up
26
J.D. Grimes
3 years 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 executed.

Example:

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

foo();
?>

b.php
<?php
return;

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

Executing a.php will output "foo".
up
2
Anonim
1 year ago
Also note, what you cannot do anything after  the 'return' usage in function.
For example:

<?php
$_SESSION
['text'] = 'Best PHP';
function
getText()
{
   
$text = $_SESSION['text'];
    return
$text;
    unset(
$_SESSION['text']);
}
echo
getText().'<br />';
echo
$_SESSION['text'];
?>

This will output:
Best PHP
Best PHP

Twice, because we have used unset() function after 'return'.
up
1
sebi at sebi dot moe
28 days ago
One situation where returning a value from a script and using it could be considered a good use is config files. Zend Framework 2 promotes this structure for this purpose, and it works pretty well.

Example config file:

<?php
return [
 
'site' => 123,
 
'settings' => 'asd'
];

Reading:

<?
php
$config
= (require 'config.php');
// Or
$config = array_merge(require 'config/local.php', require 'config/application.php');
up
0
brad dot k dot harms at gmail dot com
1 year ago
I wonder if return in the global scope would be a semantic way to store low-level, pure-PHP config arrays while avoiding polluting the global scope. For example:

<?php
// app.php

function app() {
   
$conf = include('conf.php');
}

app();

<?
php
// conf.php

return [
   
'db' => [
       
'host' => '127.0.0.1',
       
'username' => 'user',
       
'password' => 'pass'
   
],
];

?>

This approach produces exactly 0 global variables.

(PS. I also tried this using a JS-like module pattern using an anonymous function but it seems that an anon function can't be defined and called in the same expression.)
up
-50
andrew at neonsurge dot com
8 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.
To Top