Desarrollo

Funciones definidas por el programador en PHP

Desarrollo PHP

Una vez definidas nuestras funciones, pasemos ahora a ver las funciones definidas por el programador en PHP. Con lo que hemos visto y conocemos hasta ahora, este artículo será sencillo y sólo iremos viendo ejemplos muy concretos. Además, dentro de estos ejemplos veremos algunos detalles como llamadas a una función desde otra, dos o más sentencias de retorno en una función y más cosas que podremos hacer.

Sin embargo, las funciones tienen mucho más contenido a desarrollar en cuanto al paso de argumentos, variables locales o globales y ciertos aspectos más que, por ahora, no tocaremos.

Cómo implementar funciones definidas por el programador

La sintaxis básica para definir una función en PHP es utilizar la palabra reservada function seguida del nombre de la función y, entre paréntesis, el argumento o argumentos si los hubiera. Para devolver el valor de la función utilizamos la sentencia return.

Funciones con un argumento

Como hemos comentado, vamos a ver la base de la definición de funciones en PHP con ejemplos, puesto que no tiene mucho más misterio por ahora. Para funciones definidas por el programador que tengan un argumento, vamos a comprobar si un número es “perfecto” o no.

Se define un número como perfecto si es igual a la suma de todos sus divisores. Por ejemplo, el 28 es un número perfecto, pues se puede dividir por 1, 2, 4, 7 y 14, que suman 28.

<?php

function es_perfecto($num) {
	$sumatorio = 0;
	for ($i = 1; $i < $num; $i++) {
		if ($num % $i === 0) {
			$sumatorio += $i;
		}
	}

	return $sumatorio;
}

$numero = 28;
if (es_perfecto($numero) === $numero) {
	echo 'El número ' . $numero . ' es perfecto';
} else {
	echo 'El número ' . $numero . ' no es perfecto';
}

?>

Definimos la función es_perfecto($num) en donde realizamos los cálculos. Para realizarlos, recorremos todos los valores desde 1 hasta el número que queremos comprobar gracias a un bucle FOR. En él, comprobamos si el valor actual del índice $i es un divisor del número a comprobar. Para saberlo, basta con obtener el resto con el operador módulo y, si es igual a 0 en nuestra sentencia condicional IF, entonces estamos ante un divisor, por lo que lo sumamos en nuestra variable $sumatorio.

Al final del bucle, habiendo recorrido ya los números desde el 1 hasta el 27 en el ejemplo colocado, habríamos encontrado que las únicas veces que la operación módulo nos da 0 son con el 1, 2, 4, 7 y 14. Se hubieran sumado estos números en $sumatorio y, finalmente, la función hubiera devuelto esta variable.

Lo que hacemos al final es definir el número a buscar, en este caso el 28, y llamar a la función dentro de un IF. Si la función nos devuelve 28 como resultado, entonces estamos en el caso de que es igual al número que queríamos comprobar, luego es un número perfecto. Si no, pues indicamos que no lo es.

Funciones con varios parámetros

No tiene dificultad, pues una vez sabemos cómo utilizar un parámetro, los demás parámetros se colocarían después de comas. Construyamos una función muy sencilla que nos dé el área de un rectángulo.

<?php

function area_rectangulo($altura, $anchura) {
	return $altura * $anchura;
}

echo 'El área es ' . area_rectangulo(3, 4);

?>

Este ejemplo es muy sencillo. Nuestra función recibe dos parámetros y calcula su multiplicación. Podríamos pensar que, para realizar ésto, simplemente nos valía habiendo puesto una multiplicación de 3 por 4 y nos hubiéramos ahorrado la función. Exacto, pero hacer algo así nos puede ayudar en la legibilidad del código si el programador, u otra persona, tiene que revisarlo en el futuro.

Imaginad que necesitáis el área de muchos rectángulos en un programa. Cogéis y hacéis la multiplicación, sin indicar nada más. Dos años después, necesitáis revisar el programa y no sabéis qué son esas multiplicaciones. Utilizar una función con un nombre explícito es de gran ayuda en estos casos.

Funciones sin parámetros

También podemos necesitar, en muchas ocasiones, un bloque de código de uso continuo pero que no necesita parámetros. Por ejemplo porque pide los datos al usuario, por ejemplo porque es informativa o, por ejemplo, porque hace un cálculo sin necesidad de ningún parámetro.

Como todavía nos faltan algunas herramientas para cosas más útiles, veamos una función que nos imprime un mensaje publicitario.

<?php

function mensaje_publicitario() {
	return 'Aprende programación con el blog Programación Básica<br>';
}

echo 'Hola, éste es mi programa<br>';
echo mensaje_publicitario();
echo 'Hoy vamos a aprender a utilizar funciones<br>';
echo mensaje_publicitario();
echo 'Muchas gracias por leernos<br>';
echo mensaje_publicitario();

?>

El programa es un poco estúpido ahora mismo, pero nos sirve para ver que queremos repetir algo muchas veces sin necesidad de parámetros.

Funciones sin devolución de valor

También podemos crear funciones que no devuelvan nada. Por lo general, imprimirán algo por pantalla, pero no tiene por qué. Vamos a complicar un poco la función de números perfectos vista anteriormente añadiendo que, dado un número, nos muestre todos los números perfectos que hay hasta ese número.

<?php

function es_perfecto($num) {
	$sumatorio = 0;
	for ($i = 1; $i < $num; $i++) {
		if ($num % $i === 0) {
			$sumatorio += $i;
		}
	}

	return $sumatorio === $num;
}

function todos_los_perfectos($num) {
	for ($i = 1; $i < $num + 1; $i++) {
		if (es_perfecto($i)) {
			echo 'El número ' . $i . ' es un número perfecto<br>';
		}
	}
}

$numero = 28;
todos_los_perfectos($numero);

?>

Antes de la explicación, decir que este programa mostraría por pantalla que el 6 y el 28 son números perfectos. Y, como vemos, hemos creado dos funciones y podemos llamar a una función desde otra sin ningún problema.

Hagamos un pequeño repaso de lo que ocurre. Definidas las funciones, queremos comprobar si el 28 es perfecto y todos los perfectos que hay hasta llegar a él. Llamamos a todos_los_perfectos(28) que, con un bucle FOR recorre desde el 1 hasta, atención, mientras el índice sea menor a 28+1. ¿Por qué? Porque si no fuera así, el 28 no se comprobaría esta vez, y queremos comprobarlo. También podríamos haber puesto que la condición sea menor o igual, pero lo hemos dejado con el 28+1 para que veáis a simple vista que algo distinto había ahí.

En definitiva, recorremos el bucle y con índice 1 llamamos a la función es_perfecto(1). Fijáos que hemos modificado un poco la función es_perfecto pues, ahora, nos devuelve el resultado de comparar si el sumatorio es igual al número buscado. Así ya sabemos que esa función nos devuelve un true o un false. Gracias a ello, colocamos la función dentro del IF y nada más, pues la condición se evaluará dentro de la función.

Así pues, el 1 entraría en es_perfecto y devolvería false, con lo que no mostraríamos el mensaje de que es perfecto. El bucle se iría ahora al índice 2, que tampoco lo es. Iría uno por uno y, al final, en este ejemplo nos mostraría que el 6 es perfecto (1+2+3 es igual a 6) y, claro está, el 28 que ya sabíamos antes que también lo es.

Funciones que devuelven varios valores

¿Cómo podemos hacer para que unas funciones definidas por el programador nos devuelvan más de un valor? Devolviendo un array, por ejemplo. Vamos a construir una función para obtener el valor mínimo y máximo de tres números.

<?php

function maximo_tres_numeros($a, $b, $c) {
	if ($a > $b) {
		if ($a > $c) {
			return $a;
		} else {
			return $c;
		}
	} else {
		if ($b > $c) {
			return $b;
		} else {
			return $c;
		}
	}
}

function minimo_tres_numeros($a, $b, $c) {
	if ($a < $b) {
		if ($a < $c) {
			return $a;
		} else {
			return $c;
		}
	} else {
		if ($b < $c) {
			return $b;
		} else {
			return $c;
		}
	}
}

function ordenar_min_max_tres_numeros($a, $b, $c) {
	return array('minimo' => minimo_tres_numeros($a, $b, $c), 'maximo' => maximo_tres_numeros($a, $b, $c));
}

$min_max = ordenar_min_max_tres_numeros(10, 2, 5);
echo 'El mínimo es ' . $min_max['minimo'] . '<br>';
echo 'El máximo es ' . $min_max['maximo'];

?>

Varias cosas a ver aquí. En primer lugar, las dos primeras funciones se construyen para obtener el máximo de tres números y el mínimo. Podéis fijaros en que podemos tener varias sentencias return dentro de una función. Actúan un poco como la sentencia break en un bucle, pues cuando lleguemos a un return la función acaba y nos devuelve ese valor.

En el caso de estas primeras funciones, mediante varios IF comprobamos qué número es mayor o menor. Obviamente, si $a es mayor que $b y también mayor que $c, ya tenemos al mayor. Si no, seguimos buscando.

Vemos luego lo que hace la función ordenar_min_max_tres_numeros. Devuelve un array que, con índice minimo su elemento es la llamada a la función que calcula el mínimo. Y con índice maximo lo mismo pero llamando a la que calcula el máximo. Es decir, estamos devolviendo un array donde el primer elemento, de índice minimo, contiene el mínimo y el segundo el máximo. Ya hemos devuelto dos elementos en una función.

Finalmente, lo mostramos por pantalla accediendo al valor del índice que queremos en cada momento, después de haber guardado el resultado de la función en el array $min_max.

Un mundo con muchas posibilidades

A medida que vayamos utilizando funciones, y cuando en el futuro comencemos a integrarlas con las clases (programación orientada a objetos), veremos que hay muchas más posibilidades que nos pueden dar juego.

Pero, por ahora, hemos visto que con funciones definidas por el programador podemos hacer muchas cosas, empaquetar y darle más sentido y legibilidad a nuestro código. Las funciones, por tanto, nos acompañarán sin descanso en nuestros programas.

Deja una respuesta