Foros del Web » Programando para Internet » PHP »

Variables estáticas para realizar una única vez inicializaciones costosas

Estas en el tema de Variables estáticas para realizar una única vez inicializaciones costosas en el foro de PHP en Foros del Web. Hola, estoy probando el uso de variables estáticas y no sé si sirven para lo que quiero. Lo que yo necesito es tener una variable ...
  #1 (permalink)  
Antiguo 23/10/2008, 04:52
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 18 años, 7 meses
Puntos: 0
Variables estáticas para realizar una única vez inicializaciones costosas

Hola,
estoy probando el uso de variables estáticas y no sé si sirven para lo que quiero.

Lo que yo necesito es tener una variable en memoria de manera que cada vez que cualquier URL de mi aplicación tenga acceso a esa variable y que si el valor de esa variable se modifica, cualquiera que la acceda verá el nuevo valor.

Creía que para eso son las variables estáticas, pero en las pruebas que estoy haciendo cada vez que recargo la página me pierde los valores.

La prueba que estoy haciendo es muy simple:

thefunction.php:

<?php
class TheFunction {

public static $iTest = 1;

public static function myinit(){
self::$iTest++;
}
}
?>

thecall.php:

<?php

require_once("thefunction.php");

echo 'iTest antes de llamar a la funcion: '.TheFunction::$iTest.'<br/>';
TheFunction::myinit();
echo 'iTest despues de llamar a la funcion: '.TheFunction::$iTest.'<br/>';
?>

Cada vez que recargo esta url:
http://php.quique.es:8080/static/thecall.php

Obtengo la misma salida:

iTest antes de llamar a la funcion: 1
iTest despues de llamar a la funcion: 2

La idea es que la primera vez devolviese
iTest antes de llamar a la funcion: 1
iTest despues de llamar a la funcion: 2

la siguiente:
iTest antes de llamar a la funcion: 2
iTest despues de llamar a la funcion: 3

la siguiente:
iTest antes de llamar a la funcion: 3
iTest despues de llamar a la funcion: 4

...

¿Estoy haciendo algo mal o es que no se puede?

Gracias
  #2 (permalink)  
Antiguo 23/10/2008, 05:09
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 5 meses
Puntos: 48
Respuesta: Variables estáticas para realizar una única vez inicializaciones costosas

HTTP es un protocolo sin estado. Cada vez que se carga la pagina se ejecuta el script como si fuera la primera vez, cuando acaba de ejecutarse se borra de memoria todas sus variables. Asi la siquiente vez que se ejecuta se ejecuta sin saber lo que paso antes.

Si es un valor que quieres almacenar durante la visita, usa una variable de sesion. Si es algo mas permanente, tendras que almacenarlo en una base de datos o en un fichero.
  #3 (permalink)  
Antiguo 23/10/2008, 05:17
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Variables estáticas para realizar una única vez inicializaciones costosas

Hola Dark,
muchas gracias por contestar tan rápido.

Sin ánimo de entrar en un debate entre lenguajes, esto con java sí que se puede. Supongo que en php no porque no hay un servidor como el tomcat corriendo.

Un saludo
  #4 (permalink)  
Antiguo 23/10/2008, 05:24
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 5 meses
Puntos: 48
Respuesta: Variables estáticas para realizar una única vez inicializaciones costosas

Si, por lo que tengo entendido la forma de trabajar de java si permite algo parecido. Y el antigo ASP tenia algo llamado variables de aplicacion.

Los lenguajes son solo herramientas, tienes que elegir la que mas se adapte al problema. Java (o .net, ruby, python, perl) son superiores a PHP en algunas cosas, pero para la mayoria de proyectos PHP es mejor o por lo menos igual de bueno.
  #5 (permalink)  
Antiguo 23/10/2008, 05:28
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Variables estáticas para realizar una única vez inicializaciones costosas

Estoy de acuerdo contigo, por eso digo que no quiero originar el eterno debate.

Muchas gracias Darkj (antes me comí la jota)

Un saludo
  #6 (permalink)  
Antiguo 23/10/2008, 08:18
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Variables estáticas para realizar una única vez inicializaciones costosas

Hola,
ya que estamos, otra consulta de cosas estáticas. Si yo pongo este código:

function Test()
{
static $a = 0;
echo "a: $a".'<br/>';
$a++;
}

Test();
Test();
Test();
Test();
Test();
¿Como es que no se machaca el valor de "a" con cero cada vez que llamo al método? No parece, el echo devuelve cada vez uno más.
Me parece un poco raro, para mí lo lógico sería ponerlo así más o menos:

static $a = 0;
function Test()
{
echo "a:".self::$a.'<br/>';
self::$a++;
}

Test();
Test();
Test();
Test();
Test();

Gracias
  #7 (permalink)  
Antiguo 23/10/2008, 08:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Variables estáticas para realizar una única vez inicializaciones costosas

Adicionalmente a lo que comenta DarkJ, Java puede hacer eso ya que en el fondo hace lo mismo que tu harías con PHP, usa variables de sesión, solo que PHP es un poco más abierto, por lo que tu eres el que tienes que decidir si lo realizas o no.

De tu segunda duda, para eso sirve static, el interprete al ver el primer static lo ejecuta y marca como esa linea ejecutada, por eso las siguientes llamadas a test solamente incrementan el valor y lo imprimen.

Saludos.
  #8 (permalink)  
Antiguo 23/10/2008, 09:01
 
Fecha de Ingreso: septiembre-2005
Mensajes: 7
Antigüedad: 18 años, 7 meses
Puntos: 0
Respuesta: Variables estáticas para realizar una única vez inicializaciones costosas

Hola GatorV,
gracias por tu respuesta.

Me queda claro lo segundo pero no lo primero.

Entiendo que las sesiones van por usuario. Lo que yo querría hacer es, que si tengo una inicialización costosa (por ejemplo una consulta a base de datos), realizarla una sola vez y que todos los usuarios pudieran acceder a esos resultados.
Con sesiones yo creo que se tiraría la consulta una vez por usuario y no una vez para todos.

Un saludo
  #9 (permalink)  
Antiguo 23/10/2008, 09:36
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Variables estáticas para realizar una única vez inicializaciones costosas

Así es, las sesiones son por usuarios y no son compartidas, esto es una caracteristica, si lo que tu quieres hacer es tan costoso puedes usar la misma base de datos, y una tabla del tipo Memory, o en dado caso escribir en un archivo de texto general y que todos los scripts lean desde ese archivo de texto.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:13.