返回值
值通过使用可选的返回语句返回。可以返回包括数组和对象的任意类型。返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行。更多信息见 return。
注意:
如果省略了 return,则返回值为
null
。
return 的使用
示例 #1 return 的使用
<?php
function square($num)
{
return $num * $num;
}
echo square(4); // 输出 '16'。
?>
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。
示例 #2 返回一个数组以得到多个返回值
<?php
function small_numbers()
{
return [0, 1, 2];
}
// 使用短数组语法将数组中的值赋给一组变量
[$zero, $one, $two] = small_numbers();
// 在 7.1.0 之前,唯一相等的选择是使用 list() 结构
list($zero, $one, $two) = small_numbers();
?>
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符 &:
示例 #3 从函数返回一个引用
<?php
function &returns_reference()
{
return $someref;
}
$newref =& returns_reference();
?>
有关引用的更多信息, 请查看 引用的解释。

User Contributed Notes 10 notes
ryan dot jentzsch at gmail dot com ¶
5 years ago
PHP 7.1 allows for void and null return types by preceding the type declaration with a ? -- (e.g. function canReturnNullorString(): ?string)
However resource is not allowed as a return type:
<?php
function fileOpen(string $fileName, string $mode): resource
{
$handle = fopen($fileName, $mode);
if ($handle !== false)
{
return $handle;
}
}
$resourceHandle = fileOpen("myfile.txt", "r");
?>
Errors with:
Fatal error: Uncaught TypeError: Return value of fileOpen() must be an instance of resource, resource returned.
rstaveley at seseit dot com ¶
11 years ago
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";
bgalloway at citycarshare dot org ¶
14 years ago
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.
nick at itomic.com ¶
18 years ago
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
Berniev ¶
4 years ago
Be careful when introducing return types to your code.
Only one return type can be specified (but prefacing with ? allows null).
Return values of a type different to that specified are silently converted with sometimes perplexing results. These can be tedious to find and will need rewriting, along with calling code.
Declare strict types using "declare(strict_types=1);" and an error will be generated, saving much head-scratching.
k-gun !! mail ¶
5 years ago
With 7.1, these are possible yet;
<?php
function ret_void(): void {
// do something but no return any value
// if needs to break fn exec for any reason simply write return;
if (...) {
return; // break
// return null; // even this NO!
}
$db->doSomething();
// no need return call anymore
}
function ret_nullable() ?int {
if (...) {
return 123;
} else {
return null; // MUST!
}
}
?>
ryan dot jentzsch at gmail dot com ¶
6 years ago
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
zored dot box at gmail dot com ¶
4 years ago
You may specify child return type if there is no parent:
<?php
class A {
public function f ($a)
{
return 1;
}
}
class B extends A {
public function f ($a): int // + return type, OK
{
return 1;
}
}
class C extends A {
public function f (int $a) // + argument type, WARNING
{
return 1;
}
}
?>
Vidmantas Maskoliunas ¶
6 years ago
Note: the function does not have "alternative syntax" as if/endif, while/endwhile, and colon (:) here is used to define returning type and not to mark where the block statement begins.
php(@)genjo(DOT)fr ¶
2 years ago
Declaring a collection of objects as return type is not implemented and forbidden:
<?php
class Child{}
function getChilds(): Child[]
{
return [(new Child()), (new Child())];
}
var_dump(getChilds());
// Returns: Parse error: syntax error, unexpected '[', expecting '{'
?>
We have to use:
<?php
class Child{}
function getChilds(): array
{
return [(new Child()), (new Child())];
}
var_dump(getChilds());
// Returns:
/*
array (size=2)
0 =>
object(Child)[168]
1 =>
object(Child)[398]
*/
?>
Idem for function parameter:
<?php
function setChilds(Child[] $childs){}
// Not allowed
function setChilds(array $childs){}
// Allowed
?>
备份地址:http://www.lvesu.com/blog/php/functions.returning-values.php