Posts tagged ‘paso d parametros por referencia ‘




DEFINICION PASO DE PARAMETROS POR VALOR Y PASO DE PARAMETROS POR REFERENCIA

Paso de parámetros

Los parámetros son los datos que reciben las funciones y que utilizan para realizar las operaciones de la función. Una función puede recibir cualquier número de parámetros, incluso ninguno. A la hora de definir la función, en la cabecera, se definen los parámetros que va a recibir.

function f1 ($parametro1, $parámetro2)

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.

Los parámetros tienen validez durante la ejecución de la función, es decir, 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

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

OTRO EJEMPLO CLARO

Hagamos un método llamado intercambiar que reciba dos objetos Empleado y que intente intercambiar a los empleados.

image

image

Si Java hiciera un paso de parámetros por “referencia” el resultado de este ejemplo es que “a” terminaría refiriéndose a Beto y “b” terminaría refiriéndose a Ascari, sin embargo no es así. ¿Qué esta pasando internamente en memoria? ¿Por qué en el ejemplo anterior si existe un cambio en la variable que hace la llamada y  en este no?

Si el paso de parámetros Si el paso de parámetros fuera por referencia, ocurriría algo como esto.

image

Si Java hiciera un paso de parámetros por referencia, entonces “x” obtendría la dirección de memoria de “a” y “y” obtendría la dirección de memoria de “b”. Entonces cuando en el método “intercambiar” intentemos hacer que “x” apunte al Empleado Benito y que “b” apunte al Empleado “Ascari”, por ende “a” también apuntaría a “Benito” y “b” apuntaría a “Ascari”. (Figura de abajo).

image

Sin embargo, podemos comprobar que lo anterior no funciona. a sigue refiriéndose a Ascari y b a Benito. Por lo tanto, Java no acepta un paso de parámetros por referencia sino por copia o valor, pero lo que se copia es la referencia del objeto.

Ahora veamos lo que en realidad esta pasando.

image

Observamos que existe una copia de las referencias a y b. Estas referencias son copiadas en x e y. Ahora “x” apunta a Ascari y “y” a Benito.

image

Pero inmediatamente en el método “intercambiar” se realiza el intercambio.

image

Ahora vemos como “x” apunta a “Benito” y “y” apunta a “Ascari”.. Sin embargo no perdamos el foco de que tanto “a” como “b” siguen apuntando al mismo objeto!!!!!!!!!

Lo anterior demuestra de forma contundente que Java NO realiza el paso de parámetros por referencia, sino por copia, pero lo que sucede es
que se hace una copia de las referencias de objeto.

Add a comment octubre 17, 2011

Entradas recientes

Archivos

Categorías

Meta