©
This document uses PHP Chinese website manual Release
值通过使用可选的返回语句返回。可以返回包括数组和对象的任意类型。返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行。更多信息见 return 。
Note:
如果省略了 return ,则返回值为
NULL
。
Example #1 return 的使用
<?php
function square ( $num )
{
return $num * $num ;
}
echo square ( 4 ); // outputs '16'.
?>
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。
Example #2 返回一个数组以得到多个返回值
<?php
function small_numbers ()
{
return array ( 0 , 1 , 2 );
}
list ( $zero , $one , $two ) = small_numbers ();
?>
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符 &:
Example #3 从函数返回一个引用
<?php
function & returns_reference ()
{
return $someref ;
}
$newref =& returns_reference ();
?>
有关引用的更多信息, 请查看引用的解释。
PHP 7 adds support for return type declarations. Similarly to argument type declarations, return type declarations specify the type of the value that will be returned from a function. The same types are available for return type declarations as are available for argument type declarations.
Strict typing also has an effect on return type declarations. In the default weak mode, returned values will be coerced to the correct type if they are not already of that type. In strong mode, the returned value must be of the correct type, otherwise a TypeError will be thrown.
Note:
When overriding a parent method, the child's method must match any return type declaration on the parent. If the parent doesn't define a return type, then the child method may do so.
Example #4 Basic return type declaration
<?php
function sum ( $a , $b ): float {
return $a + $b ;
}
// Note that a float will be returned.
var_dump ( sum ( 1 , 2 ));
?>
以上例程会输出:
float(3)
Example #5 Strict mode in action
<?php
declare( strict_types = 1 );
function sum ( $a , $b ): int {
return $a + $b ;
}
var_dump ( sum ( 1 , 2 ));
var_dump ( sum ( 1 , 2.5 ));
?>
以上例程会输出:
int(3)Fatal error: Uncaught TypeError: Return value of sum() must be of the type integer, float returned in - on line 5 in -:5 Stack trace: #0 -(9): sum(1, 2.5) #1 {main} thrown in - on line 5
Example #6 Returning an object
<?php
class C {}
function getC (): C {
return new C ;
}
var_dump ( getC ());
?>
以上例程会输出:
object(C)#1 (0) { }
[#1] ryan dot jentzsch at gmail dot com [2015-08-30 06:12:49]
PHP 7 return types if specified can not return a null.
For example:
<?php
declare(strict_types=1);
function add2ints(int $x, int $y):int
{
$z = $x + $y;
if ($z===0)
{
return null;
}
return $z;
}
$a = add2ints(3, 4);
echo is_null($a) ? 'Null' : $a;
$b = add2ints(-2, 2);
echo is_null($b) ? 'Null' : $b;
exit();
Output:
7
Process finished with exit code 139
[#2] ahmad at myandmyhost dot comze dot com [2014-02-15 04:28:59]
we can return array using foreach
<?php
function my_func2()
{
return array("Name"=>"Ahmad Sayeed","Email"=>"ahmad@gmail.com");
}
$ar = my_func2();
foreach($ar as $key=>$value)
{echo $key." , ".$value,"<br />";}
?>
[#3] rstaveley at seseit dot com [2010-08-29 13:26:43]
Developers with a C background may expect pass by reference semantics for arrays. It may be surprising that pass by value is used for arrays just like scalars. Objects are implicitly passed by reference.
<?php
# (1) Objects are always passed by reference and returned by reference
class Obj {
public $x;
}
function obj_inc_x($obj) {
$obj->x++;
return $obj;
}
$obj = new Obj();
$obj->x = 1;
$obj2 = obj_inc_x($obj);
obj_inc_x($obj2);
print $obj->x . ', ' . $obj2->x . "\n";
# (2) Scalars are not passed by reference or returned as such
function scalar_inc_x($x) {
$x++;
return $x;
}
$x = 1;
$x2 = scalar_inc_x($x);
scalar_inc_x($x2);
print $x . ', ' . $x2 . "\n";
# (3) You have to force pass by reference and return by reference on scalars
function &scalar_ref_inc_x(&$x) {
$x++;
return $x;
}
$x = 1;
$x2 =& scalar_ref_inc_x($x); # Need reference here as well as the function sig
scalar_ref_inc_x($x2);
print $x . ', ' . $x2 . "\n";
# (4) Arrays use pass by value sematics just like scalars
function array_inc_x($array) {
$array{'x'}++;
return $array;
}
$array = array();
$array['x'] = 1;
$array2 = array_inc_x($array);
array_inc_x($array2);
print $array['x'] . ', ' . $array2['x'] . "\n";
# (5) You have to force pass by reference and return by reference on arrays
function &array_ref_inc_x(&$array) {
$array{'x'}++;
return $array;
}
$array = array();
$array['x'] = 1;
$array2 =& array_ref_inc_x($array); # Need reference here as well as the function sig
array_ref_inc_x($array2);
print $array['x'] . ', ' . $array2['x'] . "\n";
[#4] Anonymous [2010-07-09 19:54:02]
As of at least PHP 5.3, a function or class method returning an object acts like an object.
<?php
class A {
function test() {
echo "Yay!";
}
}
function get_obj() {
return new A();
}
get_obj()->test(); // "Yay!"
?>
Sorry, still doesn't work with arrays. Ie
<?php echo get_array()[1]; ?>
fails.
[#5] bgalloway at citycarshare dot org [2008-03-27 18:27:13]
Be careful about using "do this thing or die()" logic in your return lines. It doesn't work as you'd expect:
<?php
function myfunc1() {
return('thingy' or die('otherthingy'));
}
function myfunc2() {
return 'thingy' or die('otherthingy');
}
function myfunc3() {
return('thingy') or die('otherthingy');
}
function myfunc4() {
return 'thingy' or 'otherthingy';
}
function myfunc5() {
$x = 'thingy' or 'otherthingy'; return $x;
}
echo myfunc1(). "\n". myfunc2(). "\n". myfunc3(). "\n". myfunc4(). "\n". myfunc5(). "\n";
?>
Only myfunc5() returns 'thingy' - the rest return 1.
[#6] nick at itomic.com [2003-08-04 00:56:43]
Functions which return references, may return a NULL value. This is inconsistent with the fact that function parameters passed by reference can't be passed as NULL (or in fact anything which isnt a variable).
i.e.
<?php
function &testRet()
{
return NULL;
}
if (testRet() === NULL)
{
echo "NULL";
}
?>
parses fine and echoes NULL
[#7] ian at NO_SPAM dot verteron dot net [2003-01-15 04:28:35]
In reference to the poster above, an additional (better?) way to return multiple values from a function is to use list(). For example:
function fn($a, $b)
{
# complex stuff
return array(
$a * $b,
$a + $b,
);
}
list($product, $sum) = fn(3, 4);
echo $product; # prints 12
echo $sum; # prints 7