Desarrollo de aplicaciones web con PHP y MySQL

Funciones en PHP

Sergio Sáez y José Luis Poza

E.T.S. de Ingeniería Informática

Funciones en PHP

<?php
  nombre_funcion_1
();
  
nombre_funcion_2(25);
  
nombre_funcion_3(34$variable"Hola");
  
$respuestanombre_funcion_4($variable *3);
?>

Interfaz de una función

<?php resource fopen(string filenamestring mode
                  
[, bool use_include_path]); ?>


<?php
$handle 
fopen("file.txt""r"true);
$handle fopen("/home/ssaez/file.gif""wb");
$handle fopen("http://www.example.com/""r");
$handle fopen("ftp://user:password@example.com/somefile.txt""w");
?>

Errores de invocación


<?php
  $var
noexiste(25);
?>
PHP Fatal error: Uncaught Error: Call to undefined function noexiste() in Standard input code:2 Stack trace: #0 {main} thrown in Standard input code on line 2

Definición de funciones

Definición de funciones (cont.)

PHP Parse error: syntax error, unexpected 'nombre' (T_STRING) in Standard input code on line 2

Funciones con parámetros

<?php
function muestra_tabla($datos) {
  echo 
"<table border='1'>\n";

  
$valorreset($datos);
  while (
$valor !== false) {
    echo 
"<tr><td>$valor</td></tr>\n";
    
$valornext($datos);
  } 
// endwhile

  
echo "</table>\n";
// end muestra_tabla

$mis_datos= array("Fila uno",
                  
"Fila dos",
                  
"Fila tres");
muestra_tabla($mis_datos);
?>
<table border='1'>
<tr><td>Fila uno</td></tr>
<tr><td>Fila dos</td></tr>
<tr><td>Fila tres</td></tr>
</table>


Fila uno
Fila dos
Fila tres

Parámetros opcionales

<?php
function muestra_tabla($datos$border=1$cellpadding=4$cellspacing=4) {
    echo 
"<table border='$border' cellpadding='$cellpadding' ";
    echo 
"cellspacing='$cellspacing'>\n";
    
$valorreset($datos);
    while (
$valor !== false) {
        echo 
"  <tr><td>$valor</td></tr>\n";
        
$valornext($datos);
    } 
// endwhile
    
echo "</table>\n<br>\n";
// end muestra_tabla

$mis_datos= array("Fila uno""Fila dos""Fila tres");
muestra_tabla($mis_datos);
muestra_tabla($mis_datos4);
muestra_tabla($mis_datos488);
?>

Parámetros opcionales (cont.)

<table border='1' cellpadding='4' cellspacing='4'>
  <tr><td>Fila uno</td></tr>
  <tr><td>Fila dos</td></tr>
  <tr><td>Fila tres</td></tr>
</table>
<br>
<table border='4' cellpadding='4' cellspacing='4'>
  <tr><td>Fila uno</td></tr>
  <tr><td>Fila dos</td></tr>
  <tr><td>Fila tres</td></tr>
</table>
<br>
<table border='4' cellpadding='8' cellspacing='8'>
  <tr><td>Fila uno</td></tr>
  <tr><td>Fila dos</td></tr>
  <tr><td>Fila tres</td></tr>
</table>
<br>
Fila uno
Fila dos
Fila tres

Fila uno
Fila dos
Fila tres

Fila uno
Fila dos
Fila tres

Parámetros opcionales (cont.)

<?php
function muestra_tabla($datos$border=1$cellpadding=4$cellspacing=4) {
    if (!isset(
$datos))
        die(
"Variable '\$datos' indefinida en la función 'muestra_tabla'");
    echo 
"<table border='$border' cellpadding='$cellpadding' ";
    echo 
"cellspacing='$cellspacing'>\n";
    
$valorreset($datos);
    while (
$valor !== false) {
        echo 
"  <tr><td>$valor</td></tr>\n";
        
$valornext($datos);
    } 
// endwhile
    
echo "</table>\n<br>\n";
// end muestra_tabla

$mis_datos= array("Fila uno""Fila dos""Fila tres");
muestra_tabla();
?>
PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function muestra_tabla(), 0 passed in Standard input code on line 16 and at least 1 expected in Standard input code:2
Stack trace:
#0 Standard input code(16): muestra_tabla()
#1 {main}
  thrown in Standard input code on line 2

Ámbito de las variables

Ámbito de las variables (cont.)

<?php
$var
"Contenido original";

function 
una_funcion() {
  echo 
"Dentro de la funci&oacute;n: \$var = '$var' <br>\n";
  
$var"Nuevo contenido";
  echo 
"Dentro de la funci&oacute;n: \$var = '$var' <br>\n";
}

$var"Contenido antes de la funci&oacute;n";
una_funcion();
echo 
"Fuera de la funci&oacute;n: \$var = '$var' <br>\n";
?>


PHP Notice: Undefined variable: var in Standard input code on line 5 Dentro de la función: $var = ''
Dentro de la función: $var = 'Nuevo contenido'
Fuera de la función: $var = 'Contenido antes de la función'

Ámbito de las variables (cont.)

<?php
function una_funcion() {
  global 
$var;
  echo 
"Dentro de la funci&oacute;n: \$var = '$var' <br>\n";
  
$var"Nuevo contenido";
  echo 
"Dentro de la funci&oacute;n: \$var = '$var' <br>\n";
}
$var"Contenido original";
una_funcion();
echo 
"Fuera de la funci&oacute;n: \$var = '$var' <br>\n";
?>


Dentro de la función: $var = 'Contenido original'
Dentro de la función: $var = 'Nuevo contenido'
Fuera de la función: $var = 'Nuevo contenido'

Paso de variables por referencia

Volviendo de una función

<?php
function mayor($x$y) {
  if (!isset(
$x) || !isset($y)) {
    echo 
"La función espera dos parámetros\n";
    return ;
  }
  echo ((
$x $y) ? $x $y) . "\n";
}
list(
$a$b$c)= array(12.51.9);
mayor($a$b);
mayor($a$c);
mayor($a$d);
?>
2.5
1.9
PHP Notice:  Undefined variable: d in Standard input code on line 12
La función espera dos parámetros

Volviendo de una función (cont.)

<?php
function mayor($x$y) {
  if (!isset(
$x) || !isset($y)) {
    return 
false;
  } else
    return ((
$x $y) ? $x $y);
}
list(
$a$b$c)= array(12.51.9);
$maxmayor($a$b);
if (
$max !== false) echo $max "\n";
$maxmayor($a$d);
if (
$max !== false) echo $max "\n";
?>
2.5
PHP Notice:  Undefined variable: d in Standard input code on line 11

Funciones recursivas

<?php
function reverse_r($str) {
    if (
strlen($str) > 0)
        
reverse_r(substr($str,1));
    echo 
substr($str01);
}
reverse_r("Hola mundo!");
?>

Muestra:

!odnum aloH

Se ejecutan:

reverse_r("Hola mundo!")
reverse_r("ola mundo!")
reverse_r("la mundo!")
reverse_r("a mundo!")
reverse_r(" mundo!")
reverse_r("mundo!")
reverse_r("undo!")
reverse_r("ndo!")
reverse_r("do!")
reverse_r("o!")
reverse_r("!")
reverse_r("")

Funciones anidadas

<?php
function saludo() {
  function 
hola() {
    return 
"Hola";
  }
  echo 
hola() . " a todos.\n";
}
// $a= hola(); # Causaría un error fatal ya que todavía no está definida
saludo();
echo 
hola(); /* Ya se puede invocar, puesto que se
                ha definido al invocar a saludo() */
?>
Hola a todos.
Hola

Funciones variables

<?php
  
function foo() {
      echo 
"Ejecutando foo()<br />\n";
  }
  function 
bar($arg '')
  {
      echo 
"Ejecutando bar(); el parámetro es '$arg'.<br />\n";
  }
  
$func 'foo';
  
$func();        // Esto invoca a foo()
  
$func 'bar';
  
$func('test');  // Esto invoca a bar()
?>
Ejecutando foo()<br />
Ejecutando bar(); el parámetro es 'test'.<br />

Invocando métodos de objetos

<?php
  
class mensaje {
    static function 
line ($msg){
      echo 
$msg "<br>\n";
    }
    function 
par($msg) {
       echo 
"<p>$msg</p>\n";
    }
  }

  
mensaje::line("Método estático de clase!");

  
$t= new mensaje;
  
$t->par("Método de objeto!");
  
$t->line("Método estático de objeto!");
?>
Método estático de clase!<br>
<p>Método de objeto!</p>
Método estático de objeto!<br>