Definición

<?php

function suma($a, $b)
{
    return $a + $b;
}

suma (3, 8); // Devuelve 11
<?php

// En PHP 7.0 es posible definir el retorno de una función
// y también definir el tipo de dato de los parámetros.
function sumaEnteros(int $a, int $b): int
{
    return $a + $b;
}

sumaEnteros(2, 3.5);  // Suma 5
sumaEnteros(3, 'a');  // Genera error
<?php

// Declarando Modo Estricto para la función
declare(strict_types=1);

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

var_dump(sumaEnteros(3, 3.5));  // Error, el segundo parametro es float

Valores por defecto

Puede utilizar valores por defecto en los parámetros de una función.

<?php

function viajar($transporte = 'a pie')
{
    echo 'Viajaré... ', $transporte;
}

// Prueba
viajar('en tren.'); // Viajaré... en tren
viajar(); // Viajaré... a pie

Es de hacer notar que si hay varios parámetros en la función y no todos tienen valores por defecto, los que sí lo tienen deben quedar en las últimas posiciones de la función.

<?php

function hacerPastel($tipo = 'normal', $sabor)
{
    echo 'El pastel es ', $tipo, ', el sabor es de ', $sabor;
}

hacerPastel('chocolate');  // Error, valor indefinido de $sabor

Parámetros dinámicos

Es posible tener funciones que permitan establecer un número de parámetros indefinidos.

<?php

function sumatoria()
{
    // Obtener el total de parametros en una función
    $numeroParametros = func_num_args();

    // Obtener el arreglo de parametros
    $arregloParametros = func_get_args();

    $total = 0;

    for ($i = 0; $i < $numeroParametros; $i++) {
        $total += $arregloParametros[$i];
    }

    return $total;
}

var_dump(sumatoria(1, 'x'));
var_dump(sumatoria(1, 2, 3));
var_dump(sumatoria(1, 2, 3, 4));

A partir de PHP 7, es posible simplificar la declaración de la función si estos manejan un tipo de datos específico.

<?php

function sumatoria(int ...$params)
{
    $total = 0;

    for ($i = 0; $i < count($params); $i++) {
      $total += $params[$i];
    }

    return $total;
}

var_dump(sumatoria(1, 2));
var_dump(sumatoria(1, 2, 3));
var_dump(sumatoria(1, 2, 3, 4));

Parámetros por Valor y por Referencia

Al igual que en la asignación de variables, dentro de los parámetros de una función pueden pasarse por valor o por referencia.

<?php

// Argumento pasado por valor
function duplicarValor($parametro)
{
    $parametro *= 2;
}

$a = 10;               // $a = 10
duplicarValor($a);     // $a = 20
var_dump($a);          // $a = 10, la variable no cambia
<?php

// Argumento pasado por referencia
function duplicarReferencia(& $parametro)
{
    $parametro *= 2;
}

$b = 10;                // $b = 10
duplicarReferencia($b); // $b = 20
var_dump($b);           // $b = 20, la variable cambia

Funciones Condicionales

<?php

// Funciones condicionales. La función uno() no existe hasta evaluar el IF
$hacer = true;

if ($hacer) {
    function uno() {
        echo 'Llamado a uno()';
    }
}

uno(); // Solo será llamado si la condición es TRUE

Funciones Dentro de Funciones

<?php

// Funciones dentro de funciones.
// Mientras no se llama a externa(), interna() no existe.
function externa() {
    function interna() {
        echo 'Llamado a interna()';
    }
}

//interna();

// Las funciones y clases tiene un ámbito global.
// Se pueden llamar desde fuera de una función incluso
// si fueron definidas internamente.
externa();
interna();

Funciones Anónimas

Son funciones que no tienen nombre, denominadas también funciones Lambda.

<?php

$saludo = function($mensaje)
{
    echo "Hola ", $mensaje;
};

$saludo('Mundo'); // Imprime 'Hola Mundo'
$saludo('PHP');   // Imprime 'Hola PHP'

Es posible establecer argumentos de funciones, utilizando otras funciones.

<?php

function saludar($mensaje)
{
    echo 'Hola ', $mensaje;
}

saludar(function () {
    return $mensaje;
});

Cuando se accede una variable que está fuera del ámbito de una función se denomina Closure.

$persona = "Pedro";
 
$saludo = function() use ($persona) {
  echo "Hola $persona";
};

$saludo();

Documentación

Funciones en PHP