Paso de parámetros en funciones PHP

  • Por
Este capítulo explica todos los detalles relativos al paso de parámetros en las funciones PHP.

En el artículo anterior del Manual de PHP ya comenzamos a explicar las funciones en PHP. Como hemos visto, crear nuestras propias funciones no es complicado, pero tenemos que aprender diversas cosas nuevas para extraer toda su potencia.

Ahora vamos a explicar algunos detalles adicionales sobre la definición y uso de funciones en PHP, para ampliar la información anterior. En concreto, hablaremos sobre los parámetros en las funciones, ya que hay mucho más que decir para abarcar todas las posibilidades de PHP: el paso de parámetros por valor, paso por referencia, los valores predeterminados, etc. Además en este artículo veremos nuevos ejemplos de funciones que nos sirvan para ir practicando con nuevos ejemplos en PHP.

Paso de parámetros

Los parámetros son los datos que reciben las funciones y que utilizan para realizar las operaciones de esa función. Una función puede recibir cualquier número de parámetros, incluso ninguno.

Si la función que estamos construyendo no necesita recibir ningún parámetro, al declararla, simplemente indicamos los paréntesis vacíos en la cabecera. Por ejemplo en la siguiente función mostramos la fecha del día de hoy. Para ello nos apoyamos en otra función incluida en PHP: date().

function fecha_hoy() {
    echo date('d/m/Y');
}

La intención de la anterior función es mostrar la fecha del día actual. Como siempre mostrará el día de hoy, no necesito pasarle ningún parámetro, siempre hará lo mismo. Las funciones que no requieren parámetros se las invoca indicando los paréntesis vacíos.

fecha_hoy();
Nota: Si quieres saber más sobre la función date() y otras maneras de crear fechas en PHP, te recomendamos el artículo Crear y convertir fechas en PHP

En el caso que queramos, o necesitemos, recibir parámetros para implementar una función, a la hora de definirla, en la cabecera, se definen los parámetros que va a recibir.

function f1 ($parametro1, $parametro2)

Así definimos una función llamada f1 que recibe dos parámetros. Como se puede observar, no se tiene que definir el tipo de datos de cada parámetro. Es decir, la función necesitará que le enviemos dos datos, pero no le importará que sean de un tipo u otro.

Los parámetros tienen validez durante la ejecución de la función. Se dice que tienen un ámbito local a la función donde se están recibiendo. Cuando la función se termina, los parámetros dejan de existir.

Los parámetros se pasan por valor

El paso de parámetros en PHP se realiza por valor. "Por valor" es una manera típica de pasar parámetros en funciones, quiere decir que el cambio de un dato de un parámetro no actualiza el dato de la variable que se pasó a la función. Por ejemplo, cuando invocamos una función pasando una variable como parámetro, a pesar de que cambiemos el valor del parámetro dentro de la función, la variable original no se ve afectada por ese cambio. Puede que se vea mejor con un ejemplo:

function porvalor ($parametro1){ 
  $parametro1="hola"; 
  echo "<br>" . $parametro1; //imprime "hola" 
} 

$mivariable = "esto no cambia"; 
porvalor ($mivariable); 
echo "<br>" . $mivariable; //imprime "esto no cambia"

Esta página tendrá como resultado:

hola
esto no cambia

Paso de parámetros por referencia

En contraposición al paso de parámetros por valor, está el paso de parámetros por referencia. En este último caso, el cambio del valor de un parámetro dentro de una función sí afecta al valor de la variable original.

Podemos pasar los parámetros por referencia si, en la declaración de la función, colocamos un "&" antes del parámetro.

function porreferencia(&$cadena) { 
  $cadena = 'Si cambia'; 
} 

$str = 'Esto es una cadena'; 
porreferencia ($str); 
echo $str; // Imprime 'Si cambia'

Este script mostrará por pantalla 'Si cambia'.

Parámetros por defecto

Podemos definir valores por defecto para los parámetros. Los valores por defecto sirven para que los parámetros contengan un dato predefinido, con el que se inicializarán si no se le pasa ningún valor en la llamada de la función. Los valores por defecto se definen asignando un dato al parámetro al declararlo en la función.

function pordefecto ($parametro1="pepe";$parametro2=3)

Para la definición de función anterior, $parametro1 tiene como valor por defecto "pepe", mientras que $parametro2 tiene 3 como valor por defecto.

Si llamamos a la función sin indicar valores a los parámetros, estos tomarán los valores asignados por defecto:

pordefecto () // $parametro1 vale "pepe" y $parametro2 vale 3

Si llamamos a la función indicando un valor, este será tenido en cuenta para el primer parámetro.

pordefecto ("hola") // $parametro1 vale "hola" y $parametro2 vale 3

Ten en cuenta que, en el caso que quieras usar parámetros con valores por defecto, estás obligado a que éstos se declaren al final en la lista de parámetros de la cabecera de la función.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Ricardo

29/12/2006
Hola Amigos

He tenido siempre una interrogante de programación dinámica y es si es que puedo programar todo mi sitio en solo una página como por ejemplo index.php y si eso traeria dificultades de trafico por la web o problemas de compilación con el servidor; además quisiera saber si es que esa página en el sitio podría crearse un directorio virtual como por ejemplo www.cualquiercosa.com/hola.php dependiendo del link al cual haga referencia ya que a veces creo que crear carpetas y hay colocar información de cada tema se hace algo tedioso.

Gracias

Chiquito

13/1/2010
Correcto
Muy claro, muy bien explicado.
Muchas gracias

neoweb

31/3/2011
¿Cuál es la diferencia entre pasar los parámetros por valor y por referencia?
Estuve probando los ejemplos que proponen para el paso de parámetros, y me asalta una duda. Siendo bien preciso y simplista, se supone que pasando los parámetros por valor, el valor del parámetro no cambia cuando se llama a la función. En cambio, si pasamos los parámetros por referencia, el valor sí debería cambiar. Es decir (al modo como lo entiendo yo), cuando se pasa por valor, la función devuelve la $variable contenida dentro de la misma; y cuando se pasa por referencia, devuelve la $variable que está fuera de la función.

Pero resulta que, viendo los ejemplos del artículo, el resultado es el mismo tanto si se pasan los parámetros por valor o por referencia. Me explico con los siguientes códigos:

PARÁMETROS POR VALOR:

function prueba1($variable_interna) {
$variable_interna="Variable dentro de la funci&oacute;n";
return $variable_interna;
}
$variable_externa="Variable fuera de la funci&oacute;n";
echo "<p>resultado= ".prueba1($variable_externa)."</p>";


PARÁMETROS POR REFERENCIA:

function prueba2(&$otra_variable_interna) {
$otra_variable_interna="Variable dentro de la funci&oacute;n";
return $otra_variable_interna;
}
$otra_variable_externa="Variable fuera de la funci&oacute;n";
echo "<p>resultado= ".prueba2($otra_variable_externa)."</p>";

Tanto elprimer como el segundo ejemplo devuelven la variable contenida dentro de la función, siendo que los parámetros de ambas son pasadas de diferentes maneras.

¿Cuál entonces es el sentido de usar una u otra forma (por valor o por referencia) si ambas devuelven la variable contenida dentro de la función?

Seguramente algo se me escapa; puede que esté equivocado y no haya entendido bien el asunto. Quisiera me ayuden a entenderlo, por favor.

neoweb

01/4/2011
ya entendí
ok ya lo entendí: yo pensaba que la variable o parámetro que debía cambiar al pasar parámetros por referencia era la que está dentro de la función. Ahora entiendo que la que cambia es la variable que está fuera de la función y que es pasada a la misma por referencia...

:D

themillonaire

31/5/2011
paso de parámetros
excelente...!

destradar

12/10/2011
Parametros de funcion
Por favor, podrían aclararme este texto que mencionan en su página sobre valores por defecto de parámetros

"Atención, estamos obligados a declarar todos los parámetros con valores por defecto al final"

¿Qué quiere decir, estamos o no estamos obligados a pasar parámetros con valores por defecto, y por qué dice al final?

Gracias

heman90

19/11/2011
Para neoweb
Neoweb, soy muy novato pero me parece que la diferencia es que en el codigo que pasaste, esta haciendo echo en lo que retornas de la funcion con el "return". Al ejemplo que diste, en ambos casos despues de haber ejecutado la variable, dale un echo a $variable_externa y otro echo a $otra_variable_externa. Repito, fijate que en el primer caso la variable "original", que seria la externa, no cambia y en el segundo si cambia. El tema es que al imprimir con el echo directamente a la funcion, imprimis el "return" pero no estas imprimiendo la variable original. Me explico? Estoy en lo correcto?
Saludos

pablo

29/3/2012
Yo opino
Yo opino que es bastante importante las funciones por referencia ya que en algun momento la necesitaremos para devolver el valor de 2 o mas variables o bien si en algun momento necesitamos que nuestras funciones cambien el valor de una variable en general.
Ahora bien mi pregunta es se puede utilizar un return dentro de una funcion con valores por ferencia ejem:

function myFuncion(&$a)
{
$a = 34;
return true;
}

frankkoq

06/8/2012
En parametros por defecto han puesto un punto y coma en vez de coma
aqui
function pordefecto ($parametro1="pepe", $parametro2=3)