PHP
Funciones
Buscar..
Sintaxis
- function func_name ($ parametersName1, $ parametersName2) {code_to_run (); }
- function func_name ($ optionalParameter = default_value) {code_to_run (); }
- function func_name (type_name $ parametersName) {code_to_run (); }
- function & returns_by_reference () {code_to_run (); }
- function func_name (& $ referenceParameter) {code_to_run (); }
- function func_name (... $ variadicParameters) {code_to_run (); } // PHP 5.6+
- function func_name (type_name & ... $ varRefParams) {code_to_run (); } // PHP 5.6+
- function func_name (): return_type {code_To_run (); } // PHP 7.0+
Uso básico de la función
Una función básica se define y ejecuta así:
function hello($name)
{
print "Hello $name";
}
hello("Alice");
Parámetros opcionales
Las funciones pueden tener parámetros opcionales, por ejemplo:
function hello($name, $style = 'Formal')
{
switch ($style) {
case 'Formal':
print "Good Day $name";
break;
case 'Informal':
print "Hi $name";
break;
case 'Australian':
print "G'day $name";
break;
default:
print "Hello $name";
break;
}
}
hello('Alice');
// Good Day Alice
hello('Alice', 'Australian');
// G'day Alice
Pasando Argumentos por Referencia
Los argumentos de la función se pueden pasar "Por referencia", lo que permite a la función modificar la variable utilizada fuera de la función:
function pluralize(&$word)
{
if (substr($word, -1) == 'y') {
$word = substr($word, 0, -1) . 'ies';
} else {
$word .= 's';
}
}
$word = 'Bannana';
pluralize($word);
print $word;
// Bannanas
Los argumentos de objeto siempre se pasan por referencia:
function addOneDay($date)
{
$date->modify('+1 day');
}
$date = new DateTime('2014-02-28');
addOneDay($date);
print $date->format('Y-m-d');
// 2014-03-01
Para evitar la transferencia implícita de un objeto por referencia, debe clone
el objeto.
Pasar por referencia también se puede utilizar como una forma alternativa de devolver parámetros. Por ejemplo, la función socket_getpeername
:
bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )
Este método en realidad apunta a devolver la dirección y el puerto del par, pero como hay dos valores para devolver, elige usar parámetros de referencia en su lugar. Se puede llamar así:
if(!socket_getpeername($socket, $address, $port)) {
throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";
Las variables $address
y $port
no necesitan definirse antes. Lo harán:
- ser definido como
null
primero, - luego pasa a la función con el valor
null
predefinido - luego modificado en la función
- terminan definidos como la dirección y el puerto en el contexto de llamada.
Listas de argumentos de longitud variable
PHP 5.6 introdujo listas de argumentos de longitud variable (también conocidos como varargs, argumentos variadic), usando el token ...
antes del nombre del argumento para indicar que el parámetro es variadic, es decir, es una matriz que incluye todos los parámetros suministrados desde ese en adelante.
function variadic_func($nonVariadic, ...$variadic) {
echo json_encode($variadic);
}
variadic_func(1, 2, 3, 4); // prints [2,3,4]
Los nombres de los tipos se pueden agregar delante de ...
function foo(Bar ...$bars) {}
El operador &
reference se puede agregar antes de ...
, pero después del nombre de tipo (si corresponde). Considera este ejemplo:
class Foo{}
function a(Foo &...$foos){
$i = 0;
foreach($a as &$foo){ // note the &
$foo = $i++;
}
}
$a = new Foo;
$c = new Foo;
$b =& $c;
a($a, $b);
var_dump($a, $b, $c);
Salida:
int(0)
int(1)
int(1)
Por otro lado, una matriz (o Traversable
) de argumentos se puede desempaquetar para pasar a una función en forma de una lista de argumentos:
var_dump(...hash_algos());
Salida:
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
Compare con este fragmento sin usar ...
:
var_dump(hash_algos());
Salida:
array(46) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
...
}
Por lo tanto, las funciones de redireccionamiento para funciones variad ahora se pueden hacer fácilmente, por ejemplo:
public function formatQuery($query, ...$args){
return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}
Además de las matrices, también se pueden usar los Traversable
, como Iterator
(especialmente muchas de sus subclases de SPL). Por ejemplo:
$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304
Si el iterador itera infinitamente, por ejemplo:
$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);
Diferentes versiones de PHP se comportan de manera diferente:
- Desde PHP 7.0.0 hasta PHP 7.1.0 (beta 1):
- Se producirá una falla de segmentación
- El proceso de PHP saldrá con el código 139.
- En PHP 5.6:
- Se mostrará un error fatal de agotamiento de la memoria ("Tamaño de memoria permitido de% d bytes agotados").
- El proceso de PHP saldrá con el código 255
Nota: HHVM (v3.10 - v3.12) no admite el desempaquetado de
Traversable
s. En este intento se mostrará un mensaje de advertencia "Sólo se pueden desempaquetar los contenedores".
Alcance de la función
Las variables dentro de las funciones están dentro de un ámbito local como este.
$number = 5
function foo(){
$number = 10
return $number
}
foo(); //Will print 10 because text defined inside function is a local variable