PHP Funcións

De MediaWiki
Ir a la navegación Ir a la búsqueda

Funcións definidas polo usuario

  • Unha función é un conxunto de instrucións que se executan ao ser 'chamada' ou 'invocada' a función a través do seu nome.
  • Unha función pode (é optativo) levar parámetros que veñen ser variables cuxos valores son utilizados dentro da función.
  • Sintaxe:
1 <?php
2 function exemplo($arg_1, $arg_2, /* ..., */ $arg_n)
3 {
4     echo "Función de exemplo.\n";
5     return $valor_devolto;
6 }
7 ?>
  • Como vemos unha función vai poder devolver un valor o cal pode ser utilizado polo código que a chama.
  • Os nomes das funcións seguen as mesmas regras que as demais etiquetas de PHP. Un nome de función válido comeza cunha letra ou guión baixo, seguido de calquera número de letras, números ou guións baixos.
  • Vexamos un exemplo dunha función que devolve a suma de dous números pasados como parámetros:
 1 <?php
 2     function sumarNumeros($val1,$val2){
 3         return $val1+$val2;
 4     }
 5 ?>
 6 
 7     <body>
 8         <?php
 9             $num1=5;
10             $num2=10;
11             
12             printf("Suma dos números:%d", sumarNumeros($num1, $num2));
13             echo "<br/>";
14             if (sumarNumeros($num1, $num2)>10){
15                 echo "A suma da mais que 10...";
16             }
17         ?>
Fixarse como na liña 13 amosamos o resultado da chamada á función e na liña 15 utilizamos a función como unha expresión dentro da cláusula if.
Dará como resultado:
Suma dos números:15
A suma da mais que 10...
Como norma xeral definiremos a función antes da súa chamada (eu as poño antes da etiqueta <body>). Isto só é necesario se definimos unha función como resultado dunha condición (poderíamos definir unha función dentro dun if).


  • Na definición da función, se non o indicamos, os parámetros van poder ser de calquera tipo ao igual que o valor de retorno, pero podemos indicar o tipo tanto dos parámetros como do valor que vai retornar. Isto será sempre máis seguro e será a opción recomendada a non ser que non coñezamos o tipo de dato que imos enviar.
1 <?php
2     function sumarNumeros(int $val1,int $val2): int
3     {
4         return $val1+$val2;
5     }
6 ?>
Nota: Se a función pode devolver un tipo de dato ou nulo se pode indicar poñendo ?int. Tamén se pode aplicar ao tipo de dato do parámetro se consideramos que pode recibir un valor null, podemos definilos da forma: function sumarNumeros(?int $val1,?int $val2): int



  • Unha función pode devolver calquera tipo de dato, como pode ser boolean, e utilizalas como parte dunha condición:
 1 <?php
 2     function eMaior(int $val1,int $val2): bool
 3     {
 4         if ($val1<0 || $val2<0 || $val1<$val2){
 5             return false;
 6         }
 7         return true;
 8     }
 9 ?>
10     <body>
11         <?php
12             $num1=5;
13             $num2=10;
14        
15             if (eMaior($num1, $num2)){
16                 echo '$num1 é maior que $num2 e ademaís son positivos';
17             }
18             
19         ?>


Dará como resultado:
$num1 é maior que $num2 e ademaís son positivos


OBRIGATORIO: Sempre que cremos unha función será obrigatorio describir (en forma de comentario enriba da definición da función) o seu cometido e explicar a función dos parámetros. O veremos na sección de documentación desta unidade.




Acceder a variables definidas 'fora' da función

  • Se temos definidas variables definidas fora da función necesitaremos facer uso:
  • Ou da palabra reservada global dentro da función
  • Ou do array $GLOBALS['variable']
Para poder acceder ao seu valor.

Paso de parámetros por valor / referencia

  • Xa vimos cando estudamos as variables globais, que dentro dunha función as variables son locais a ela. Quere isto dicir que as modificacións que fagamos sobre as variables non afectan a esas variables fora da función.
  • O mesmo pasa cos parámetros.
Por defecto, a modificación do valor dun parámetro dentro dunha función non vai afectar ao valor da variable que se usou para chamar á función.
  • Vexamos un exemplo:
 1 <?php
 2     function concatenaMoeda(string $cadea){
 3         $valor_local=' euros';
 4         $cadea = $cadea . $valor_local;
 5         
 6     }
 7 ?>
 8     <body>
 9         <?php
10             $prezo=35.45;
11             concatenaMoeda($prezo);
12             
13             printf("Cadea \$prezo modificado:%s",$prezo);
14             
15         ?>


Dará como resultado:
Cadea $prezo modificado:35.45


  • Se queremos que ó modificar o valor do parámetro $cadea na función modificase o valor da variable $prezo teremos que pasalo por referencia.
Para iso debemos de definir o parámetro da función có símbolo &
  • Vexamos o exemplo anterior:
 1 <?php
 2     /* 
 3      * Función que concantena un texto co nome da moeda a un prezo
 4      */
 5     function concatenaMoeda(string &$cadea){
 6         $valor_local=' euros';
 7         $cadea = $cadea . $valor_local;
 8         
 9     }
10 ?>
11     <body>
12         <?php
13             $prezo=35.45;
14             concatenaMoeda($prezo);
15             
16             printf("Cadea \$prezo modificado:%s",$prezo);
17             
18         ?>


Dará como resultado:
Cadea $prezo modificado:35.45 euros

Valores por defecto

  • Unha función pode ter parámetros definidos cun valor por defecto. Neses casos, a chamada a función se pode facer sen enviar un dato a ese parámetro, collendo dentro da función o valor por defecto definido.
Importante: Se na función existen parámetros obrigatorios e parámetro opcionais, teñen que ir ao final todos os opcionais.
Vexamos un exemplo:
 1 <?php
 2 function getNomeCompleto(string $nome,string $apel1,string $apel2=''): string{
 3 
 4     return sprintf("$apel1 $apel2, $nome");
 5 }
 6 
 7 echo '<br />';
 8 print(getNomeCompleto('Angel','Fernandez','Gonzalez'));
 9 echo '<br />';
10 print(getNomeCompleto('Juan','Ramirez'));
11 
12 
13 ?>




Documentación

  • En PHP é moi recomendable documentar as funcións para que outros programadores (ou ti mesmo no futuro) poidan entender facilmente que fai o código, que entradas necesita e que resultados devolve.
A forma máis usada é empregar PHPDoc, un estándar baseado en comentarios especiais que comezan con /** ... */. Estes comentarios sitúanse xusto enriba da definición da función.



Estrutura básica da documentación dunha función en PHP

  • Breve descrición: Unha frase curta que explique o propósito da función.
  • @param: Define cada parámetro que recibe a función. Inclúe:
  • o tipo de dato esperado (int, string, array, bool, float, object...).
  • o nome do parámetro.
  • unha descrición opcional.
  • @return: Indica o tipo de dato que devolve a función e unha breve explicación. Se pode empregar tipo1|tipo2 se devolve diferentes tipos de datos.
  • (Opcional) @throws: Se a función pode lanzar excepcións, especifícase aquí.


Exemplo en PHP con documentación
 1 <?php
 2 /**
 3  * Calcula a suma de dous números enteiros.
 4  *
 5  * @param int $a Primeiro número a sumar.
 6  * @param int $b Segundo número a sumar.
 7  * @return int Resultado da suma de $a e $b.
 8  */
 9 function sumar(int $a, int $b): int {
10     return $a + $b;
11 }
12 
13 ?>
Explicación dos elementos
  • @param int $a → Indica que o primeiro parámetro $a debe ser un enteiro.
  • @param int $b → Igual que o anterior pero para o segundo parámetro.
  • @return int → A función devolverá un enteiro, neste caso a suma.


Exercicios propostos

  • Exercicio 1: Crea unha función que devolva a suma de dous números. Debes comprobar que os datos enviados son números. En caso de que non o sexan deberá de amosar o erro. Se o son amosa a suma.


  • Exercicio 2: Crea unha función que amose o texto Ola, XXXXX sendo XXXXX o nome definido nunha variable fora da función.


  • Exercicio 3: Crea unha función que calcule a área en base a dous parámetros: base e altura. Ditos parámetros teñen que ser numéricos e a función terá que devolver como moito dous díxitos decimais. Se non se envían valores, a base terá por defecto o valor 5 e a altura o valor 3. En caso de que non sexan números deberá amosar un erro.


  • Exercicio 4: Crea unha función cun parámetro que incremente o valor de dito parámetro e que modifique o valor da variable coa que se chama a dita función, sen empregar global.


  • Exercicio 5: Crea unha función que concatene dúas cadeas nos parámetros e teña valor por defecto cadea baleira. Soamente debe concatenar se o número de caracteres totais é maior a 10. En caso contrario debe devolver null e quen a chama, controlar o error e amosar un texto en caso de erro ou as cadeas concatenadas se toda vai ben.









Solución Exercicios propostos

  • Solución Exercicio 1: Crea unha función que devolva a suma de dous números. Debes comprobar que os datos enviados son números. En caso de que non o sexan deberá de amosar o erro. Se o son amosa a suma.
<!DOCTYPE html>
<html>
<head>
    <title>Exemplo de función en PHP</title>
</head>
<body>
    <h1>Función para sumar números</h1>
    <?php
      /**
       * Suma dous valores se ambos son numéricos.
       *
       * Esta función comproba primeiro se os dous parámetros recibidos son valores numéricos.  
       * - Se son válidos, devolve a súa suma.  
       * - Se non son numéricos, devolve unha mensaxe de erro.  
       *
       * @param mixed $numero1 Primeiro valor a sumar. Pode ser calquera tipo, mais debe ser numérico para que a operación sexa válida.
       * @param mixed $numero2 Segundo valor a sumar. Igual que o anterior, debe ser numérico.
       *
       * @return int|float|string Devolve a suma como número enteiro ou decimal se os dous parámetros son correctos.  
       *                          En caso contrario devolve unha cadea de texto cunha mensaxe de erro.
       */
        function sumar($numero1, $numero2) {
            // Comprobar se ambos parámetros son números
            if (is_numeric($numero1) && is_numeric($numero2)) {
                $resultado = $numero1 + $numero2;
                return $resultado;
            } else {
                return "Ambos parámetros deben ser números.";
            }
        }

        // Chamar á función e amosar o resultado
        $num1 = 5;
        $num2 = "texto"; // Cambia este valor para probar con datos no numéricos
        $resultado_suma = sumar($num1, $num2);

        if (is_numeric($resultado_suma)) {
            echo "A suma de $num1 e $num2 é igual a $resultado_suma.";
        } else {
            echo $resultado_suma;
        }
    ?>
</body>
</html>



  • Solución Exercicio 2: Crea unha función que amose o texto Ola, XXXXX sendo XXXXX o nome definido nunha variable fora da función.
<!DOCTYPE html>
<html>
<head>
    <title>Exemplo de función en PHP</title>
</head>
<body>
    <h1>Función que accede a unha variable externa</h1>
    <?php
        // Variable definida fora da función
        $nome = "Ana";

         /**
         * Amosa unha mensaxe de saúdo empregando unha variable global.
         *
         * Esta función accede á variable global `$nome` e imprime un saúdo personalizado.
         * Non recibe parámetros e non devolve ningún valor, só realiza a saída de texto.
         *
         * @global string $nome Nome da persoa ao que se lle vai dirixir o saúdo.
         *
         * @return void
         */        
         function saudar() {
            global $nome; // Acceder á variable global $nome
            echo "Ola, $nome!";
        }

        // Chamar á función
        saudar();
    ?>
</body>
</html>



  • Solución Exercicio 3: Crea unha función que calcule a área en base a dous parámetros: base e altura. Ditos parámetros teñen que ser numéricos e a función terá que devolver como moito dous díxitos decimais. Se non se envían valores, a base terá por defecto o valor 5 e a altura o valor 3. En caso de que non sexan números deberá amosar un erro.
<!DOCTYPE html>
<html>
<head>
    <title>Exemplo de función con comprobación de parámetros en PHP</title>
</head>
<body>
    <h1>Función para calcular o área dun rectángulo</h1>
    <?php
    /**
     * Calcula a área dun rectángulo a partir da súa base e altura.
     *
     * A función comproba se os dous parámetros son valores numéricos:  
     * - Se son válidos, devolve a área arredondada a dous decimais.  
     * - Se non son numéricos, devolve unha mensaxe de erro.  
     *
     * @param $base Lonxitude da base do rectángulo. Ten como valor por defecto 5. Non poño o tipo na definición do parámetro e se podería enviar de calquera tipo.
     * @param $altura Altura do rectángulo. Ten como valor por defecto 3. Non poño o tipo na definición do parámetro e se podería enviar de calquera tipo.
     *
     * @return float|string Devolve a área como número decimal se os datos son correctos.  
     *                      En caso contrario devolve unha cadea de texto cunha mensaxe de erro.
     */
    function calcularAreaRectangulo($base = 5, $altura = 3): float|string {
        // Comprobar se ambos parámetros son números
        if (is_numeric($base) && is_numeric($altura)) {
            // Calcular o área con máximo de 2 decimais
            $area = round($base * $altura, 2);
            return $area;
        } else {
            return "Ambos parámetros deben ser números.";
        }
    }

        // Chamar á función con parámetros personalizados
        $areaPersonalizada = calcularAreaRectangulo(8, 4);
        echo "O área do rectángulo coa base 8 e altura 4 é $areaPersonalizada.<br>";

        // Chamar á función sen especificar parámetros (valores por defecto)
        $areaPorDefecto = calcularAreaRectangulo();
        echo "O área do rectángulo coa base e altura por defecto é $areaPorDefecto.<br>";

        // Chamar á función con parámetros non numéricos
        $areaNonNumerica = calcularAreaRectangulo("texto", 3);
        echo "Resultado co primeiro parámetro non numérico: $areaNonNumerica.";
    ?>
</body>
</html>



  • Solucion Exercicio 4: Crea unha función cun parámetro que incremente o valor de dito parámetro e que modifique o valor da variable coa que se chama a dita función, sen empregar global.
<!DOCTYPE html>
<html>
<head>
    <title>Exemplo de función con paso de parámetros por referencia en PHP</title>
</head>
<body>
    <h1>Función con paso de parámetros por referencia</h1>
    <?php
         /**
         * Incrementa en 1 o valor dun número pasado por referencia.
         *
         * Esta función recibe unha variable por referencia e increméntaa en unha unidade.
         * Non devolve ningún valor, xa que a modificación aplícase directamente sobre a variable orixinal.
         *
         * @param int &$numero Número enteiro que será incrementado por referencia.
         *
         * @return void
         */
        function incrementarPorReferencia(int &$numero): void {
            $numero++; // Incrementar o número por referencia
        }


        // Declarar una variable
        $valor = 5;

        // Chamar á función para incrementar a variable por referencia
        incrementarPorReferencia($valor);

        // Amosar o valor da variable despois de chamar á función
        echo "O valor da variable é: $valor"; // Mostrará "O valor da variable é: 6"
    ?>
</body>
</html>



  • Solucion Exercicio 5: Crea unha función que concatene dúas cadeas nos parámetros e teña valor por defecto cadea baleira. Soamente debe concatenar se o número de caracteres totais é maior a 10. En caso contrario debe devolver null e quen a chama, controlar o error e amosar un texto en caso de erro ou as cadeas concatenadas se toda vai ben.
<!DOCTYPE html>
<html>
<head>
    <title>Exemplo de función en PHP con concatenación de cadeas</title>
</head>
<body>
    <h1>Función para concatenar cadeas</h1>
    <?php
         /**
         * Concatena dúas cadeas de texto se a súa lonxitude total é maior ca 10 caracteres.
         *
         * A función calcula a lonxitude combinada das dúas cadeas:  
         * - Se é maior a 10, devolve a concatenación.  
         * - Se non, devolve `null`.  
         *
         * @param string $cadea1 Primeira cadea de texto a concatenar. Valor por defecto: cadea baleira.
         * @param string $cadea2 Segunda cadea de texto a concatenar. Valor por defecto: cadea baleira.
         *
         * @return string|null Devolve a concatenación das dúas cadeas cando a lonxitude total supera 10.  
         *                     En caso contrario devolve `null`.
         */
        function concatenarCadeas(string $cadea1 = '', string $cadea2 = ''): ?string {
            // Calcular a lonxitude total das cadeas
            $lonxitudeTotal = strlen($cadea1) + strlen($cadea2);

            // Comprobar se a lonxitude total é maior a 10
            if ($lonxitudeTotal > 10) {
                return $cadea1 . $cadea2; // Concatenar as cadeas
            } else {
                return null;
            }
        }


        // Probar a función
        $resultado = concatenarCadeas("Hola, ", "mundo!");

        if ($resultado !== null) {
            echo "Resultado: $resultado"; // Mostrará "Resultado: Hola, mundo!"
        } else {
            echo "Houbo un erro na función.";
        }
    ?>
</body>
</html>




-- Ángel D. Fernández González -- (2025).