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!
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
jajaja gracias … algunos temas si son muy especificos
Pa’ que veas que no soy la única que a veces no te entiende! jajaja