Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/10/2007, 02:27
yoguuu
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 4 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';
?>