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:

  1. ser definido como null primero,
  2. luego pasa a la función con el valor null predefinido
  3. luego modificado en la función
  4. terminan definidos como la dirección y el puerto en el contexto de llamada.

Listas de argumentos de longitud variable

5.6

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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow