Definiciones
Las funciones de usuario en PHP pueden definirse usando el keyword function(). Toda función debe ser definida sólo una vez, no pudiendo ser re-definida en el futuro. Hasta PHP 3.0 sólo puede usarse una función que haya sido definida antes de ser usada, pero en PGP 4.0 esta limitación ya no es efectiva.
function imprime_arreglo($arreglo) {
echo "<UL>n";
foreach ( $arreglo as $item ) {
echo "<LI>item\n";
};
echo "</UL>n";
}
Las funciones pueden o no retornar algo. Ese algo puede ser cualquier cosa mientras se trata de un sólo valor. Para retornar múltiples valores es necesario retornar un arreglo y recibirlo usando list().
function imprime_archivo($archivo) {
$lineas = file( $archivo );
foreach( $lineas as $linea ){
echo htmlspecialchars($linea) . "\n";
};
return count($lineas);
}
function stat_simple($archivo) {
return array( filesize($archivo), filectime($archivo) );
}
$arch = "prueba.txt";
list( $size, $ctime ) = stat_simple( $arch );
$fecha_hora = date( "d/m/y h:i", $ctime );
echo "El archivo $arch pesa $size bytes y fue modificado el $fecha_hora";
Argumentos
Los argumentos pueden ser cualquier número de argumentos, mezclando arreglos y escalares; todos ellos son pasados por valor, es decir, la función recibe una copia de los valores, sin poder modificar las variables originales.
function suma_rara($a,$b) {
$a--;
$b++;
return $a+$b;
} $x = 3;
$y = 5;
$resultado = suma_rara( $x, $y );
echo "$x + $y = $resultado\n"; # 3 + 5 = 8
Para pasar argumentos por referencia y por lo tanto poder modificarlos, se antepone un signo ampersand (&) al argumento en la función:
function elevar_al_cuadrado( &$a ) {
$a = $a * $a;
}; $x = 15;
elevar_al_cuadrado( $x );
echo $x; # 225
Se puede pasar una lista variable de argumentos a una función en PHP 4, mediante el uso de func_num_args() y func_get_args.
function variables() {
$argc = $func_num_args();
$argv = $func_get_args();
echo "Son $argc argumentos\n".
foreach( $argv as $num => $arg ) {
$type = gettype( $arg );
echo "Argumento $num, tipo $type, valor $arg\n";
};
}
variables( "casa", 9, array( "k", 6, "x" ) );
Un argumento cualquiera puede tener asignado un valor por omisión. Los argumentos que tienen valores por omisión siempre deben ser los primeros de la lista de argumentos.
function ls ( $directorio = "." ) {
$dirHandle=opendir($directorio);
while ($fname = readdir($dirHandle)) {
echo "$fname\n";
} closedir($dirHandle);
}; ls(); # Lista directorio actual
ls("/tmp"); # Lista el temporal
Alcance de variables
Fuera de una función, todas las variables pertenecen al mismo espacio de nombres, incluyendo todo tipo de archivos o módulos que sean incluídos.
Dentro de una función, las variables son locales a menos que se diga lo contrario usando global():
$archivo_datos = "datos.txt";
function lee_archivo_mal() {
$arch = $archivo_datos;
return file( $arch );
};
function lee_archivo_bien_version_1() {
$arch = global( $archivo_datos );
return file( $arch ); }; function lee_archivo_bien_version_2() {
global( $archivo_datos ); # Importa el nombre al espacio
return file( $archivo_datos ); }; function lee_archivo_bien_version_3() {
return file( $GLOBALS["archivo_datos"] );
};
[Nota para programadores PERL] En PHP es como si cada variable dentro de una función hubiera sido declarada con el operador my() de Perl.
Un último tipo de variable está constituído por las variables estáticas, que pertenecen a una función y no cambian de valor.
function corta_recursion();
static $numero_llamadas = 0; # Sólo se ejecuta una vez
$numero_llamadas++;
if( $numero_llamadas < 100 ) {
echo "Llamando recursivamente, nivel $numero_llamadas\n";
corta_recursion();
}; }