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";
Возврат значений
Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть массивы и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана. Для получения более детальной информации ознакомьтесь с описанием return.
Замечание:
Если конструкция return не указана, то функция вернет значение
NULL.
Пример #1 Использование конструкции return
<?php
function square($num)
{
return $num * $num;
}
echo square(4); // выводит '16'.
?>
Функция не может возвращать несколько значений, но аналогичного результата можно добиться, возвращая массив.
Пример #2 Возврат нескольких значений в виде массива
<?php
function small_numbers()
{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>
Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор & и при описании функции, и при присвоении переменной возвращаемого значения:
Пример #3 Возврат результата по ссылке
<?php
function &returns_reference()
{
return $someref;
}
$newref =& returns_reference();
?>
Для получения более детальной информации о ссылках обратитесь к разделу документации Подробно о ссылках.
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
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.
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.
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
A function can only return one value, but that value can be an array or other compound value. If you want to just define several variables into the global scope within your function you can do two things:
1. return an array from your function and then run the extract() function
$result_array = test ();
extract ($result_array);
2. Or you can just append the variables to the $GLOBALS array:
$array = array ('first' => 'john', 'middle' => 'q', 'last' => 'public');
function upper_case () {
global $array;
foreach ($array as $key => $value)
{
$GLOBALS[$key] = strtoupper ($value);
}
}
upper_case ();
echo "$first $middle $last";
// returns JOHN Q PUBLIC
In this second example you can create multiple values without necessarily returning anything from the function. This may be handy for applying several functions (stripslashes, trim, etc..) accross all elements of $_POST or $_GET and then having all of the newly cleaned up variables extracted out for you.
