Ver Mensaje Individual
  #23 (permalink)  
Antiguo 30/03/2005, 11:54
Avatar de sism82
sism82
 
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 21 años, 2 meses
Puntos: 1
porpuesta

MartinTandil: me parece perfecto, hacen falta proponer mas solcuciones para llegar a la ideal.

Cluster:
voila....... a riesgo de volver a equivocarme (ojalá mas gente aporte equivocaciones :p para estar mas cerca de encontrar la solución), creo que lo único que hace falta es que todas las instancias manipulen la misma variable "$content" del padre. Creo que se soluciona sencillamente con una referencia. Cluster, lo que propongo a continuación no es optimo, pero considerando que en php4 todas las variables son publicas, tal vez puedas hacer lo siguiente. Por favor, revisen el código para ver si me equivoco :p. Desde luego puede haber mas cosas que necesiten compartirse, como por ejemplo métodos, pero de eso no se sabrá hasta checar el código de las extensiones.

Código PHP:
$pdf_extension_handler->LoadExtension('ClasePadre');
$pdf_extension_handler->LoadExtension('ClaseHijaUno');
$pdf_extension_handler->LoadExtension('ClaseHijaDos'); 
ahora bien, ya tenemos 3 instancias separadas. Suponiendo que la variable que deben compartir es ClasePadre::$Content, se podría tal vez hacer esto ??? la importancia radica en el método LoadExtension...

Código PHP:
final class FpdfExtensionsHandler
{
    const 
HANDLERS_DIRECTORY   'path/al/directorio/de/las/clases_extensiones/';
    private 
$extensions        = array();
    private 
$content_reference null;
    public  
$extension         null;
    
    public function 
__construct()
    {
        return 
true;
    }

    
/**
    * @return Bool
    * @param String $ExtensionName
    */
    
public function LoadExtension($ExtensionName)
    {
        
$extension_path self::HANDLERS_DIRECTORY.$ExtensionName
        
if ( file_exists($extension_path) && !class_exists($ExtensionName) )
        {
            include_once(
$extension_path);
            
$share_content = empty($this->extensions) ? false true//si ya se cargo un objeto, se debe compartir la variable content
            
$this->extensions[$ExtensionName] = new $ExtensionName();
            
$this->extension =& $this->extensions->[$ExtensionName]; //se genera una referencia al ultimo objeto instanciado
            //si se debe compartir el contenido, se reescribe la variable content del recien instanciado objeto
            
if ( $share_content )
            {
                 
//todas las instancias trabajaran sobre la misma referencia a content
                
$this->extension->content =& $this->content_reference;
            }
            else 
//de otra forma se inicializa la referencia a content
            
{
                
$this->content_reference $this->extension->content;
            }
            return 
true;
        }
        else
        {
            return 
false;
        }
    } 
    
    
/**
     * @return Bool
     * @param String $ExtensionName
     */
    
public function SetExtension($ExtensionName)
    {
        if ( 
array_key_exists($ExtensionName,$this->extensions) )
        {
            
$this->extension =& $this->extensions[$ExtensionName];
            return 
true;
        }
        else
        {
        return 
false;
        }
    }

ah por cierto, sorry, lo quitale las palabras de visibilidad a las variables y metodos (public, private etc), la costumbre :)