PHP y static, el viejo dilema

Como ya habia discutido con algunos amigos acerca de para que demonios sirven los static en PHP, retomé el dilema y me puse a buscar mas sobre usos de estaticas en PHP ( la queria particularmente para hacer un singleton ). Me volví a encontrar con lo mismo, solamente paginas PHP con ejemplos, la documentación oficial y los usos y scopes que pueden tener las variables. Pero fue hasta que bajé un wrapper de mysqli en PHP, que me hizo ver las cosas desde otra perspectiva.

Tal y como habia investigado, las variables estáticas en PHP son estáticas solamente durante la vida del script. Malamente yo estoy mas acostumbrado y tengo mas experiencia en java, por lo que tambien estoy acostumbrado a que las variables estáticas mantengan su valor mientras la aplicación esté corriendo. Pero en php, si tienes por decir, dos scripts PHP a.php y b.php, y tenemos el siguiente código en a.php:

class singleton {        private static $instancia ;

private $visits;

private function __construct() {

                $visits = 0 ;

        }

public static function GetInstance($vendor) {

                // fijate a ver si tiene instancia

                if ( !isset( self::$instancia ) ) {

                        echo "no tenia una instancia ... creando una :)  ";

                        self::$instancia = new singleton( );

                }

                return self::$instancia;

}

public function masVisitas( ) {

                $this->visits++;

        }

public function getVisitas( ){

                return $this->visits;

        }

}

$x = singleton::GetInstance(  );

        $x->masVisitas( );

        echo " en a tenemos " . $x->getVisitas( );

y desde b.php quieres acceder el singleton,

$b = singleton::GetInstance( );

$b->masVisitas( );

echo " desde b.php tenemos " . $b->getVisitas( );

éste se vuelve a cargar de nuevo. Yo no le veía el sentido de tener un singleton si cada vez que cargas otra nueva página se vuelve a inicializar, se vuelve a crear una nueva instancia, y se meten sus datos como debe hacerlo; yo decía, ¿donde está lo estático? :-(   Si quieres hacer una cache o un arreglo de datos que se pueda acceder desde cualquier parte del sitio, como este claro ejemplo de número de visitas, en PHP simplemente n o  s e  p u e d e.  Por alguna parte tambien me encontré la implementación de un singleton que lo que hacia era serializar los datos que quieres guardar en tu arreglo/variable de tu singleton, y guardarlos en un archivo cada vez que terminaba el script; y leerlos al abrir otro PHP y cargarse de nuevo.  Obvio, tambien se podria hacer con base de datos, pero el objetivo era tener todo esto en memoria.

Para esto me puse a investigar sobre mysqli, qué es, con qué se come y como se usa ( tal vez ponga un post de esto mas adelante ).  Me topé con un singleton en un wrapper de mysqli que me encontré (lizdb, se puede encontrar en sourceforge ), y pues abrí los ojos: fue cuando me di cuenta que ‘para eso puede servir’, y la base de datos es un claro ejemplo; es decir, cuantas veces en un script accedes base de datos ? más de una; si lees algo para el header, despues si sacas algo de info del usuario, tema o cosa que este relacionado el script, datos estadisticos, etc.  Todo esto se puede usar utilizando la misma instancia de alguna conexión de base de datos, e internamente lo único que va haciendo es ir ejecutando query tras query, en lugar de hacer N instancias y por consiguiente N conexiones a base de datos para cada query.  En lo que ayuda, es el hecho de que PHP puedes tener anidados 100 includes, y no puedes controlar cuantas instancias tienes de qué cosas; ahí es donde es práctico el singleton con su PHP-style static.

Bueno, solo fue algo que se me vino a la mente, y quería postearlo aquí, ya que no encontré mucho sobre esto como me imaginaba que hubiera. Saludos!

3 Responses to “PHP y static, el viejo dilema”

  1. Emh… mi vido, no entiendo un corno francés de PHP, statics singleton, mysqli, etc, pero te quiero mucho amiguito y tu blog está chido :D

  2. jajaja gracias … algunos temas si son muy especificos

  3. Pa’ que veas que no soy la única que a veces no te entiende! jajaja :P

Discussion Area - Leave a Comment