Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Estas en el tema de Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Wenas :) Pues esta mañana me desperté ocioso a las 4 de la mañana y me he puesto a hacer un codiguito que trata el ...
  #1 (permalink)  
Antiguo 29/10/2007, 02:27
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Wenas :)

Pues esta mañana me desperté ocioso a las 4 de la mañana y me he puesto a hacer un codiguito que trata el tema con el que siempre he tenido problemas. El ciclo de vida de objetos y el uso de clases.

En el ejemplo lo que hago básicamente es cargar 3 clases en un archivo index.php y y creo 3 archivos que usan estas 3 clases desde el index.php. De esta forma al ser cargados todos los archivos de forma relativa al index.php el ciclo de vida de los objetos debe estar vigente. Hoy me parece una chorrada abrumadora. Pero debo reconocer aunque me parezca patético que esto me ha bloqueado mucho durante mucho tiempo.

Ya que ultimamente juego con el Patrón Singleton lo he incluido (cargado) en el archivo indice y he retomado la misma instancia desde el mismo fichero index.php y también por si acaso desde otro archivo que haya pasado algun include/require que otro... para estar seguros que nada falla...

Crear los archivos en un mismo directorio y ejecutar el index.php esto creo lo hará mas claro... Mmmm... Ah... tambien el que esté ocioso le invito a prolongar el ejemplo rizando el rizo... freestyle!

Un saludo ;)

Clase: a.php
Código PHP:
<?php
class {
    private 
$a;
    
    function 
__construct() {
        echo 
"Class A: Loaded";
    }
    
    function 
setA($a) {
        
$this->$a;
        echo 
$this->a;
    }
}
?>
Clase: a.php
Código PHP:
<?php
class {
    private 
$b;
    
    function 
__construct() {
        echo 
"Class B: Loaded";
    }
    
    function 
setB($b) {
        
$this->$b;
        echo 
$this->b;
    }
}
?>
Clase: c.php
Código PHP:
<?php
class {
    private 
$c;
    
    function 
__construct() {
        echo 
"Class C: Loaded";
    }
    
    function 
setC($c) {
        
$this->$c;
        echo 
$this->c;
    }
}
?>
Archivo: index1.php
Código PHP:
<?php
$a
->setA('<br />Seteada la variable \'a\' en \'index1.php\' usando la clase \'a.php\'');
include 
'index2.php';
?>
Archivo: index2.php
Código PHP:
<?php
$b
->setB('<br />Seteada la variable \'b\' en \'index2.php\' usando la clase \'b.php\'');
include 
'index3.php';
?>
Archivo: index3.php
Código PHP:
<?php
$c
->setC('<br />Seteada la variable \'c\' en \'index3.php\' usando la clase \'c.php\' <br />---------------------------------------<br />');
$instance3 Singleton::getInstance();    var_dump($instance3);
?>
Clase: Singleton.php
Código PHP:
<?php
class Singleton {
    static private 
$instance;

    private function 
__construct() {}
    
    static function 
getInstance() {
        if (!isset(
self::$instance)) {
            
$c __CLASS__;
            
self::$instance = new $c;
        }
        return 
self::$instance;
    }    
}
?>
Archivo: index.php
Código PHP:
<?php
/* *
 * 
 *    0.    La clase es cargada al ser instanciada gracias al método mágico __autoload.
 *        0.1.    Creamos la instancia '$instance1' y vemos que var_dump devuelve el indentificador '#1'
 *        0.2.    Creamos una instancia con otro nombre para enfatizar que es algo nuevo... esta vez '$instance2' y vemos que var_dump devuelve el indentificador '#1' de nuevo.
 *        0.3.    El patrón lo que ha hecho ha sido volver a utilizar la instancia '#1', por que esta ya habia sido llamada, de esta manera nos aseguramos utilizar siempre la misma instancia.
 *        0.4.     En el archivo 'index3.php' creo otra instancia llamada 'instance3' y como explico en el punto3 aunque la clase haya sido cargada en este mismo archivo la instancia funciona por los includes correlativos.
 *    Objetivo del punto 0: Demostrar que el patrón singleton reutiliza la instancía que creó anteriormente al instanciar la clase.
 *
 * */
 
    
$instance1 Singleton::getInstance();    var_dump($instance1);    echo "<br />";
    
$instance2 Singleton::getInstance();    var_dump($instance2);    echo "<br />---------------------------------------<br />";


/* *
 * 
 *     1.     Creamos una clase '__autoload' para la carga de las librerias/clases 'Singleton', 'a', 'b', y 'c'. 
 *     
 * */

function __autoload($class) {
    require_once 
$class.".php";
}

/* *
 *     
 *     2.     Instanciamos las librerias/clases 'a', 'b', y 'c'.
 *
 * */

$a = new A();    echo "<br />";
$b = new B();    echo "<br />";
$c = new C();    echo "<br />---------------------------------------";

/* *
 *     3.     Cargaremos el archivo 'index1.php' que usará la clase 'a' instanciada en el archivo 'index.php' como '$a'.
 *         3.1.    El archivo 'index1.php' a su vez cargará el archivo 'index2.php' que usará la clase 'b' instanciada en el archivo 'index.php' como '$b'.
 *         3.2.    El archivo 'index2.php' a su vez cargará el archivo 'index3.php' que usará la clase 'c' instanciada en el archivo 'index.php' como '$c'.
 * 
 *     Objetivo del punto 3: Demostrar que una vez hemos cargado e instanciado una clase en un archivo determinado este podrá ser usado por los subsiguientes archivos que sean cargados dentro del ambito del primero ya que su carga ha sido correlativa, el index3 dentro del index2, el index2 dentro del index1 y el index1 a su vez dentro del archivo index donde se cargaron las clases por primera vez.
 *
 * */
 
require_once 'index1.php';
?>
  #2 (permalink)  
Antiguo 29/10/2007, 02:29
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Una cosa más... Yo ya sé ke es una fumada... Pero lo he hecho a las 4 de la mañana al despertarme xDD bastante con ke funcione no ? xDDD
  #3 (permalink)  
Antiguo 29/10/2007, 09:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

No entiendo tu ejemplo, cuando tu haces:
archivo: ejemplo.php
Código PHP:
$foo "foo desde ejemplo"
archivo: index.php
Código PHP:
$foo "foo inicial";
include( 
"ejemplo.php" );

echo 
$foo
Es lo mismo que esto:
Código PHP:
$foo "foo inicial";
$foo "foo desde ejemplo";

echo 
$foo
Es decir, al usar el include el interprete de PHP incluye el archivo en el punto desde donde se llama y ejecuta el contenido, asi que aqui no estas aplicando Singleton correctamente.

Singleton es la capacidad de usar un objeto mismo en todos los ambitos de ejecucion (en PHP es en cada request), imagina algo asi:

Código PHP:
class {
     public function 
algoA() {
          
$obj Singleton::getInstance();
          
$obj->setValor"Valor alterado en A" );
     }
}

class 
{
      public function 
algoB() {
            
$obj Singleton::getInstance();
            
$obj->setValor("Valor alterado desde B");
       }
}

class 
{
        public function 
algoC() {
                
$obj Singleton::getInstance();
                
$obj->setValor("Valor cambiado desde C!");
        }
}

$a = new A();
$b = new B();
$c = new C();

$instance Singleton::getInstance();
echo 
sprintf"Viendo valor inicial de Singleton: %s"$instance->getValor() );
echo 
"Alterando desde A";
$a->algoA();
echo 
sprintf"Valor de Singleton: %s"$instance->getValor() );
echo 
"Alterando desde B";
$b->algoB();
echo 
sprintf"Valor de Singleton: %s"$instance->getValor() );
echo 
"Alterando desde C";
$c->algoC();
echo 
sprintf"Valor de Singleton: %s"$instance->getValor() ); 
Aqui como puedes ver 3 clases diferentes usan el mismo objeto y alteran su valor, y pueden estar regados en archivos diferentes (cada clase en su file) pero todos se refieren al mismo objeto en el runtime a la hora de usar el Singleton que es la clase unica.

Saludos.
  #4 (permalink)  
Antiguo 29/10/2007, 13:45
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 9 meses
Puntos: 70
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Bueno, bueno bueno... veo que se enredaron y necesitan que les aclare...

Les voy a explicar:

.
.
.



Soy tan ignorante en este tema que no puedo ni explicar como instanciar un objeto Sòlo me asome por acá "recopilando" info sobre OO y me causò curiosisad lo del mètodo Singleton, es un método propio de OO o es de Php?? Para qué se utiliza?? Algún ejemplo o link

Gracias de antemano
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #5 (permalink)  
Antiguo 29/10/2007, 14:55
 
Fecha de Ingreso: octubre-2007
Mensajes: 21
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

No crees ke en la clase Singleton deveria haver una 2 funciones para que funcione

Código PHP:
function setValor($str){
$this->valor $a
}

function 
getValor(){
return 
$this->valor

quedando la clase singleton asi?

Código PHP:
<?php
class Singleton {
    static private 
$instance;

    private function 
__construct() {}
    
    static function 
getInstance() {
        if (!isset(
self::$instance)) {
            
$c __CLASS__;
            
self::$instance = new $c;
        }
        return 
self::$instance;
    }    

        public function 
setValor($str){
           
$this->valor $a
        }

     public function 
getValor($str){
          return 
$this->valor
      }


}
?>
o me ekivoco corrigueme!!
  #6 (permalink)  
Antiguo 29/10/2007, 15:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Cita:
Iniciado por Carxl Ver Mensaje
Bueno, bueno bueno... veo que se enredaron y necesitan que les aclare...

Les voy a explicar:

.
.
.



Soy tan ignorante en este tema que no puedo ni explicar como instanciar un objeto Sòlo me asome por acá "recopilando" info sobre OO y me causò curiosisad lo del mètodo Singleton, es un método propio de OO o es de Php?? Para qué se utiliza?? Algún ejemplo o link

Gracias de antemano
Puedes buscar en el foro.. http://www.forosdelweb.com/f68/que-singleton-518732/

Saludos.
  #7 (permalink)  
Antiguo 29/10/2007, 15:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Cita:
Iniciado por oVuzZ Ver Mensaje
No crees ke en la clase Singleton deveria haver una 2 funciones para que funcione

Código PHP:
function setValor($str){
$this->valor $a
}

function 
getValor(){
return 
$this->valor

quedando la clase singleton asi?

Código PHP:
<?php
class Singleton {
    static private 
$instance;

    private function 
__construct() {}
    
    static function 
getInstance() {
        if (!isset(
self::$instance)) {
            
$c __CLASS__;
            
self::$instance = new $c;
        }
        return 
self::$instance;
    }    

        public function 
setValor($str){
           
$this->valor $a
        }

     public function 
getValor($str){
          return 
$this->valor
      }


}
?>
o me ekivoco corrigueme!!
Asi es faltaria solo agregar las funciones a la clase Singleton, no las puse porque creo que van de mas.

Saludos.
  #8 (permalink)  
Antiguo 29/10/2007, 22:52
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Discrepo un poco de lo discutido aqui por vosotros GatorV y oVuzZ...

Lo único que pretendía en el ejemplo del singleton era evidenciar que solo se usaba una id de objeto... la misma siempre. Solo haciendo esto ya es singleton bajo mi opinión...

Despues si tu quieres que esa clase singleton que siempre adquiere la misma id de objeto a pesar de su instancia haga funciones de setter o getter... pues añades metodos... pero no creo que forme esto parte del patrón.

Ahora no pretendía usar el singleton con las otras clases de ejemplo... aunque lo metí en el archivo index3.php que si usa una clase c.php pero esto era solo para seguir viendo que a pesar de includes/requires seguia adquiriendo el mismo id de objeto la instancia. Y los metodos setA, setB, setC que uso tampoco tienen realmente nada que ver con la llamada de la clase singleton. son independientes en este caso.

Siendo mas claro... Son 'DOS EJEMPLOS': 1 es el que muestra la id de objeto del singleton. Y 2 y totalmente independiente del singleton es el uso de 3 clases separadas en 3 archivos que son usadas desde 3 archivos remotos pero que todos han sido llamados desde un punto central index.php y como decia al principio lo que muestra este segundo ejemplo es algo muy simple pero ke de una forma bastante patética me ha ido blokeando mucho tiempo.

No quiero crispar ni busco crear un debate... soy bastante constructivo... y aunque creo no estar equivocado siempre estoy abierto a nuevas opiniones.

Un saludo
  #9 (permalink)  
Antiguo 29/10/2007, 23:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

El problema con tu ejemplo es que no estas probando nada, como te dije ve este ejemplo:
ejemplo.php
Código PHP:
$foo "alterado!!"
index.php
Código PHP:
$foo "foo inicial";
include( 
"ejemplo.php" );

echo 
$foo
Podras ver que la variable $foo se cambia en ejemplo pq ambas hacen una llamada a la misma variable, esto es un comportamiento natural de los requires e includes, lo que hacen es solo incluir el contenido donde los llaman y ejecutarlos, si en ese momento hay variables se sobreescriben o inicializan dependiendo del caso.

Puedes hacer un nesting muy grande de includes y requieres y siempre llamaran a la misma variable, esto es porque estan en el ambito global del script.

Singleton lo que busca es que tu puedas utilizar un objeto en cualquier clase de forma estatica (en lenguajes persistentes como JSP, puedes iniciar un objeto que este "vivo" a lo largo de multiples requests, en PHP no es posible pero se puede emular).

Es por eso que tu ejemplo no es totalmente correcto, porque no estas demostrando nada, para demostrar Singleton es ver como un objeto puede persistir a lo largo de diferentes llamadas en diferentes funciones.

Saludos.
  #10 (permalink)  
Antiguo 30/10/2007, 00:04
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Hola GatorV, Buenos días.

El código que has puesto está bien, la variable claro es la misma y se sobreescribe. Al usar includes lo único que haces es bueno dividir el codigo en archivos... pero siempre tiene un ambito global.

Más sigo creyendo que lo que yo hago en este ejemplo es diferente, es decir:
En el ejemplo donde me explicas y que yo te agradezco. defines la variable foo antes del include... luego al tener el include otra asignación a la misma variable, esta sería sobreescrita.

Pero yo no hago esto. Si nos quitamos del ejemplo del singleton, lo dejamos a parte y nos centramos en el otro. Lo que yo hice fue:

En el archivo index.php instanciar tres clases a.php, b.php, c.php, que son autocargadas gracias al __autoload. Las instancias son $a, $b y $c, pero no he definido ningun miembro antes de su carga por lo que no sería posible sobreescribir. Luego una vez tengo instanciadas las tres clases a, b, c, y consecuentemente cargados sus archivos, lo que hago es un nesting(anidado) de includes desde index.php de los archivos index1.php, index2.php, index3.php. Estos archivos los cree pensando en que index1 podría manejar la instancia $a y por tanto la clase a y así igual index2 y 3 con $b y $c. Pero esto es solo conceptual, está claro que si usamos includes todo va al include_path se trata globalmente y los 3 archivos podrian usar las 3 instancias de clase perfectamente. sea por la instancia o sean llamadas estáticas.

Es solo como digo una separación conceptual crear un archivo que lo cargue index.php y luego crear x archivos para manejar x clases cada archivo se podría engargar de las llamadas de una clase.

Entiendo lo que me quieres decir de veras... pero no creo ke haga nada mal. quizá la idea será mas o menos buena xD eso no lo discuto...

Sobre singleton si hay algo que me has aclarado sobre como debe ser eso de "emular la persistencia"...

Un saludo ;) y gracias por molestarte en contestarme a estas horitas ;)

Última edición por yoguuu; 30/10/2007 a las 00:18
  #11 (permalink)  
Antiguo 30/10/2007, 08:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Ok, en ese caso si tu ejemplo podria ser "valido" aunque rompes un poco con el concepto de POO, ya que eso es lo comun que haces con Programacion Procedural, en POO, lo que haces es clases que utilizen otras clases a su vez.

Si tu rompes la implementacion de tus clases en archivos subsecuentes haces mas dificil de leer el codigo a que si mantienes tu implementacion en un archivo, la definicion de tus clases en otros archivos y por ultimo un Frontcontroller donde todo se inicializa y se hacen las llamadas.

Asi mantienes tu codigo en archivos necesarios y no rompes en las llamadas a las clases.

Saludos.
  #12 (permalink)  
Antiguo 31/10/2007, 00:10
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 3 meses
Puntos: 2
Re: Ejemplo: carga centralizada de clases, uso semidescentralizado y singleton.

Aham... osea sería mas o menos que al valerme de includes para hacer las llamadas desde archivos separados estaría de algun modo quebrando la forma en que las clases deberian trabajar... uhmm interesante.

Cita:
Iniciado por GatorV
Si tu rompes la implementacion de tus clases en archivos subsecuentes haces mas dificil de leer el codigo a que si mantienes tu implementacion en un archivo, la definicion de tus clases en otros archivos y por ultimo un Frontcontroller donde todo se inicializa y se hacen las llamadas.
MMMmmm... lo que me estarías proponiendo entonces... en vez de basarme en includes subsecuentes como lo que estaba proponiendo y partir todo el tema jeje. Sería clases por un lado, y por ultimo un front controller dotado de la suficiente "inteligencia" como para realizar lo que pasaría en esos includes que hice...

Voy a buscar más ejemplos de front controller, por el foro, por san google, y aunque me sabe mal pedirte... si tu tienes alguno a mano sería de gran ayuda.

Un saludo de este padawan de la orden POO :P xDDDD
Jaijaiaajiajaja
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 14:42.