Valores de las variables
Cuando hablábamos de las variables, nos referíamos a su ámbito y comentábamos que las variables definidas dentro de una función pierden sus valores en el momento en el que abandonemos el ámbito de esa función, es decir, cuando finaliza su ejecución.
Decíamos también que si el ámbito en el que hubiera sido definida fuera externo a una función los valores sólo se perderían –temporalmente– mientras durara la eventual ejecución de las instrucciones de aquella y que, una vez acabado ese proceso, volvían a recuperar sus valores.
Bajo estas condiciones, si invocáramos repetidamente la misma función obtendríamos cada vez el mismo resultado.
Las posibles modificaciones que pudieran haberse efectuado (a través de las instrucciones contenidas en la función) en el valor inicial de las variables, se perderían cada vez que abandonáramos la función con lo cual, si hiciéramos llamadas sucesivas, se repetirían tanto el valor inicial como el resultado.
Decíamos también que si el ámbito en el que hubiera sido definida fuera externo a una función los valores sólo se perderían –temporalmente– mientras durara la eventual ejecución de las instrucciones de aquella y que, una vez acabado ese proceso, volvían a recuperar sus valores.
Bajo estas condiciones, si invocáramos repetidamente la misma función obtendríamos cada vez el mismo resultado.
Las posibles modificaciones que pudieran haberse efectuado (a través de las instrucciones contenidas en la función) en el valor inicial de las variables, se perderían cada vez que abandonáramos la función con lo cual, si hiciéramos llamadas sucesivas, se repetirían tanto el valor inicial como el resultado.
Variables estáticas
Para poder conservar el último valor de una variable definida dentro de una función basta con definirla como estática.
La instrucción que permite establecer una variable como estática es la siguiente:
static nombre = valor;
P. ej: si la variable fuera $a y el valor inicial asignado fuera 3 escribiríamos:
static $a=3;
La variable conservará el último de los valores que pudo habérsele asignado durante la ejecución de la función que la contiene. No retomará el valor inicial hasta que se actualice la página.
Variables de variables
La instrucción que permite establecer una variable como estática es la siguiente:
static nombre = valor;
P. ej: si la variable fuera $a y el valor inicial asignado fuera 3 escribiríamos:
static $a=3;
La variable conservará el último de los valores que pudo habérsele asignado durante la ejecución de la función que la contiene. No retomará el valor inicial hasta que se actualice la página.
<? # Observa que hemos prescindido de los encabezados HTML. # No son imprescindibles para la ejecución de los scripts /* Escribamos una función y llamémosla sinEstaticas Definamos en ella dos variables sin ninguna otra especificación e insertemos las instrucciones para que al ejecutarse se escriban los valores de esas variables */ function sinEstaticas(){ # Pongamos aquí sus valores iniciales $a=0; $b=0; # Imprimamos estos valores iniciales echo "Valor inicial de $a: ",$a,"<br>"; echo "Valor inicial de $b: ",$b,"<br>"; /* Modifiquemos esos valores sumando 5 al valor de $a y restando 7 al valor de $b. $a +=5 y $b -=7 serán quienes haga esas nuevas asignaciones de valor ya lo iremos viendo, no te preocupes */ $a +=5; $b -=7; # Visualicemos los nuevos valores de las variables echo "Nuevo valor de $a: ",$a,"<br>"; echo "Nuevo valor de $b: ",$b,"<br>"; } # Escribamos ahora la misma función con una modificación que será # asignar la condición de estática a la variable $b # Llamemos a esa función: conEstaticas function conEstaticas(){ # Definimos $b como estática $a=0; static $b=0; echo "Valor inicial de $a: ",$a,"<br>"; echo "Valor inicial de $b: ",$b,"<br>"; $a +=5; $b -=7; echo "Nuevo valor de $a: ",$a,"<br>"; echo "Nuevo valor de $b: ",$b,"<br>"; } # Insertemos un texto que nos ayude en el momento de la ejecución print ("Esta es la primera llamada a sinEstaticas()<br>"); # Invoquemos la función sinEstaticas; sinEstaticas(); # Añadamos un nuevo comentario a la salida print ("Esta es la segunda llamada sinEstaticas()<br>"); print ("Debe dar el mismo resultado que la llamada anterior<br>"); # Invoquemos por segunda vez sinEstaticas; sinEstaticas(); # Hagamos ahora lo mismo con la función conEstaticas print ("Esta es la primera llamada a conEstaticas()<br>"); conEstaticas(); print ("Esta es la segunda llamada a conEstaticas()<br>"); print ("El resultado es distinto a la llamada anterior<br>"); conEstaticas(); ?> |
Variables de variables
Además del método habitual de asignación de nombres a las variables -poner el signo $ delante de una palabra-, existe la posibilidad de que tomen como nombre el valor de otra variable previamente definida.
La forma de hacerlo sería esta:
$$nombre_variable_previa;
Veamos un ejemplo.
Supongamos que tenemos una variable como esta:
$color="verde";
Si ahora queremos definir una nueva variable que utilice como nombre el valor (verde) que está contenido en la variable previa ($color), habríamos de poner algo como esto:
$$color="es horrible";
¿Cómo podríamos visualizar el valor de esta nueva variable?
Habría tres formas de escribir la instrucción:
print $$color;
o
print ${$color};
o también
print $verde;
Cualquiera de las instrucciones anteriores nos produciría la misma salida: es horrible.
Podemos preguntarnos ¿cómo se justifica que existan dos sintaxis tan similares como $$color y ${$color}? ¿Qué pintan las llaves?.
La utilización de las llaves es una forma de evitar situaciones de interpretación confusa.
Supongamos que las variables tienen un nombre un poco más raro.
Por ejemplo que $color no se llama así sino $color[3] (podría ser que $color fuera un array –una lista de colores– y que esta variable contuviera el tercero de ellos).
En este supuesto, al escribir: print $$color[3] cabría la duda de si el número 3 pertenece (es un índice) a la variable $color o si ese número corresponde a $$color.
Con print ${$color[3]} no habría lugar para esas dudas. Estaríamos aludiendo de forma inequívoca a 3 como índice de la variable $color.
¿Qué ocurre cuando la variable previa cambia de valor?
Cuando la variable utilizada para definir una variable de variable cambia de valor no se modifica ni el nombre de esta última ni tampoco su valor.
Puedes ver este concepto, con un poco más de detalle, en el código fuente del ejemplo.
Fuente:
Página del ifstic: http://www.isftic.mepsyd.es/formacion/enred/
La forma de hacerlo sería esta:
$$nombre_variable_previa;
Veamos un ejemplo.
Supongamos que tenemos una variable como esta:
$color="verde";
Si ahora queremos definir una nueva variable que utilice como nombre el valor (verde) que está contenido en la variable previa ($color), habríamos de poner algo como esto:
$$color="es horrible";
¿Cómo podríamos visualizar el valor de esta nueva variable?
Habría tres formas de escribir la instrucción:
print $$color;
o
print ${$color};
o también
print $verde;
Cualquiera de las instrucciones anteriores nos produciría la misma salida: es horrible.
Podemos preguntarnos ¿cómo se justifica que existan dos sintaxis tan similares como $$color y ${$color}? ¿Qué pintan las llaves?.
La utilización de las llaves es una forma de evitar situaciones de interpretación confusa.
Supongamos que las variables tienen un nombre un poco más raro.
Por ejemplo que $color no se llama así sino $color[3] (podría ser que $color fuera un array –una lista de colores– y que esta variable contuviera el tercero de ellos).
En este supuesto, al escribir: print $$color[3] cabría la duda de si el número 3 pertenece (es un índice) a la variable $color o si ese número corresponde a $$color.
Con print ${$color[3]} no habría lugar para esas dudas. Estaríamos aludiendo de forma inequívoca a 3 como índice de la variable $color.
¿Qué ocurre cuando la variable previa cambia de valor?
Cuando la variable utilizada para definir una variable de variable cambia de valor no se modifica ni el nombre de esta última ni tampoco su valor.
Puedes ver este concepto, con un poco más de detalle, en el código fuente del ejemplo.
<? |
Fuente:
Página del ifstic: http://www.isftic.mepsyd.es/formacion/enred/
No hay comentarios:
Publicar un comentario