CakeFest 2024: The Official CakePHP Conference

Devolver valores

Los valores son devueltos usando la sentencia opcional return. Se puede devolver cualquier tipo, incluidos arrays y objetos. Esto causa que la función finalice su ejecución inmediatamente y pase el control de nuevo a la línea desde la que fue llamada. Véase return para más información.

Nota:

Si se omite return, el valor devuelto será null.

Empleo de return

Ejemplo #1 Empleo de return

<?php
function cuadrado($núm)
{
return
$núm * $núm;
}
echo
cuadrado(4); // imprime '16'.
?>

Una función no puede devolver múltiples valores, pero se pueden obtener resultados similares devolviendo un array.

Ejemplo #2 Devolver un array para obtener múltiples valores

<?php
function números_pequeños()
{
return array (
0, 1, 2);
}
list (
$cero, $uno, $dos) = números_pequeños();
?>

Para devolver una referencia desde una función use el operador de referencia &, en la declaración de la función y cuando se asigne el valor devuelto a una variable:

Ejemplo #3 Devolver una referencia desde una función

<?php
function &devolver_referencia()
{
return
$algunaref;
}

$nuevaref =& devolver_referencia();
?>

Para más información sobre referencias, por favor, lea las Referencias explicadas.

Declaraciones de tipo de devolución

PHP 7 añade soporte para las declaraciones de tipo de devolución. De forma similar a las declaraciones de tipo de argumento, las declaraciones de tipo de devolución especifican el tipo del valor que serán devuelto desde una función. Están disponibles los mismos tipos para las declaraciones de tipo de devolución que para las declaraciones de tipo de argumento.

La tipificación estricta también tiene efecto sobre las declaraciones de tipo de devolución. En el modo predeterminado de tipificacón débil, los valores devueltos serán forzados al tipo correcto si no son ya de ese tipo. En el modo fuerte, el valor devuelto debe ser del tipo correcto, o de lo contrario se lanzará una excepción TypeError.

A partir de PHP 7.1.0, los valores de retorno pueden ser marcados como anulables anteponiendo el prefijo nombre de tipo con un signo de interrogación (?). Esto significa que la función devuelve el tipo especificado o null.

Nota:

Al sobrescribir un método padre, el método hijo debe hacer coincidir cualquier declaración de tipo de devolución del padre. Si el padre no define un tipo de devolución, el método hijo puede hacerlo.

Ejemplos

Ejemplo #4 Declaración básica de tipo de devolución

<?php
function sum($a, $b): float {
return
$a + $b;
}

// Observe que será devuelto un float.
var_dump(sum(1, 2));
?>

El resultado del ejemplo sería:

float(3)

Ejemplo #5 El modo estricto en acción

<?php
declare(strict_types=1);

function
sum($a, $b): int {
return
$a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1, 2.5));
?>

El resultado del ejemplo sería:

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

Ejemplo #6 Devolver un objeto

<?php
class C {}

function
getC(): C {
return new
C;
}

var_dump(getC());
?>

El resultado del ejemplo sería:

object(C)#1 (0) {
}

Ejemplo #7 Declaración de tipo de retorno anulable (a partir de PHP 7.1.0)

<?php
function get_item(): ?string {
if (isset(
$_GET['item'])) {
return
$_GET['item'];
} else {
return
null;
}
}
?>
add a note

User Contributed Notes 4 notes

up
26
ryan dot jentzsch at gmail dot com
7 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.
up
24
rstaveley at seseit dot com
13 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";
up
10
bgalloway at citycarshare dot org
16 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.
up
6
nick at itomic.com
20 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
To Top