Apuntes php

PHP: Porque a veces necesitas un poco de caos en tu vida.

Lección: Funciones de Usuario

PHP ofrece gran cantidad de funciones predefinidas, pero también puedes crear tus propias funciones. Estas son porciones de código que puedes llamar cuando quieras, perfectas para desarrollar funcionalidades y reutilizarlas sin tener que repetir el código.

Definición de funciones

Una función de usuario se crea con la palabra reservada function. Para usarla, simplemente llamas su nombre. Aquí un esquema básico:

<?php
function hiperlink() {
    // Código de la función
}

hiperlink(); // Llama a la función
?>

Nota: Los paréntesis () son obligatorios, incluso sin parámetros.
El código va dentro de llaves {}.
PHP no distingue entre mayúsculas y minúsculas en nombres de funciones (Hiperlink = hiperlink), pero sé consistente.
En mensajes de error, PHP muestra nombres en minúsculas.

<?php
function holaMundo() {
    echo "Hola, mundo!\n";
}

holaMundo(); // Imprime: Hola, mundo!
?>

Cualquier código PHP válido puede ir dentro de una función.

¿Cuándo llamar a una función?

Puedes llamar a una función antes o después de definirla, porque PHP lee todas las definiciones al cargar el script:

<?php
holaMundo(); // Funciona

function holaMundo() {
    echo "Hola, mundo!\n";
}
?>

También puedes definir funciones en un archivo separado y cargarlo con include o require:

<?php
require 'funciones.php';
holaMundo();
?>

Cuidado con funciones condicionales:

<?php
$buenHumor = false;

if ($buenHumor) {
    function holaMundo() {
        echo "Hola, mundo!\n";
    }
}

holaMundo(); // Error fatal: Call to undefined function holaMundo()
?>

Si la condición no se cumple, la función no se define.
Otro error es definir la misma función dos veces (por ejemplo, incluyendo un archivo varias veces).

Funciones con parámetros

Las funciones pueden recibir parámetros que serán utilizados por el código que contienen. Los parámetros pueden pasarse por valor (copia del dato) o por referencia (modifica el original):

<?php
declare(strict_types=1);

$msg = "Cómo estás?";

function holaMundoPorValor(string $msg): string {
    $msg = "Hola, mundo! " . $msg;
    echo "$msg\n";
    return $msg;
}

function holaMundoPorReferencia(string &$msg): void {
    $msg = "Hola, mundo! " . $msg;
    echo "$msg\n";
}

holaMundoPorValor($msg); // Imprime: Hola, mundo! Cómo estás?
echo "$msg\n"; // Imprime: Cómo estás?

holaMundoPorReferencia($msg); // Imprime: Hola, mundo! Cómo estás?
echo "$msg\n"; // Imprime: Hola, mundo! Cómo estás?
?>

Cuando llamas a la función holaMundoPorValor($msg), el mensaje se modifica solo dentro de la función, pero la variable $msg fuera de la función permanece igual. Esto sucede porque PHP pasa los valores por copia, no por referencia, a menos que se indique lo contrario. En cambio, al pasar por referencia (&$msg), la variable $msg se modifica dentro de la función y persiste fuera de ella.

Nota: La forma de definir funciones ha cambiado desde PHP 7; ahora puedes especificar qué tipo de dato debe recibir una función, como string, int, array, etc.
Tambien podemos declarar el tipo de retorno de una función. Al colocar : string, le estamos diciendo a PHP que esta función debe devolver un valor de tipo string.
No es obligatorio pero se recomienda para evitar errores y como medida de seguridad

Nota: Usa (string) para forzar el tipo del parámetro si viene de una fuente no confiable:

<?php
$msg = 123; // De un formulario
holaMundoPorValor((string)$msg);
?>

Parámetros por defecto

Puedes definir valores por defecto para parámetros:

<?php
function saludar(string $msg = "Hola, ¿cómo estás?"): string {
    return "Saludo: $msg\n";
}

echo saludar(); // Imprime: Saludo: Hola, ¿cómo estás?
echo saludar("Hasta luego"); // Imprime: Saludo: Hasta luego
?>

Nota: Los parámetros con valores por defecto deben ir al final:

<?php
function ejemplo(string $obligatorio, string $opcional = "valor"): string {
    return "$obligatorio, $opcional\n";
}
?>

Retornando valores

Usa return para devolver un valor desde la función. El código después de return no se ejecuta:

<?php
function unirMensaje(string $msg): string {
    const SALUDO = "Hola, mundo!";
    return SALUDO . " " . $msg;
}

$mensaje = unirMensaje("Cómo estás?");
echo "$mensaje\n"; // Imprime: Hola, mundo! Cómo estás?
?>

Ámbito de variables

Las variables dentro de una función son locales y no afectan las variables externas, salvo si usas global o parámetros por referencia:

<?php
$contador = 0;

function incrementar(): void {
    $contador = 1; // Variable local
    echo "Dentro: $contador\n";
}

incrementar(); // Imprime: Dentro: 1
echo "Fuera: $contador\n"; // Imprime: Fuera: 0
?>

Para acceder a variables externas, usa global (con cuidado):

<?php
function incrementarGlobal(): void {
    global $contador;
    $contador++;
}
?>
TOP