Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/03/2005, 09:46
Cluster
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 23 años
Puntos: 129
Extender objetos

Hola ..

(introducción)
Estoy usando la classe "FPDF" (www.fpdf.org) que genera PDF's dinámicos desde PHP. Bien, dicha classe tiene como ejemplos bastantes "classes" que extienden a la classe padre para aportar nuevas funcionalidades.

Hasta aquí todo OK, .. el detalle está que cada extensión funciona por sí sola pero hay funcionalidades de várias extensiones (que extenden a la classe padre) que me gustaría usar.

Actualmente .. lo único que hago es tomar todos esos métodos y demás lógica del las classes "extensoras" (no sé como llamarlo) y las uno (cut-and-poaste) sobre una classe "extended". Supongo que esto si bien funciona . .no será lo "políticamente correcto" .. así que quería saber si UDs. conocen la técnica para trabajar este tipo de problemas .. Supongo que algún array como "contenedor" y temas similares .. pero mi conocimiento de OOP es bajo .. sólo soy "usuario" de OOP con este requerimiento. (para ejemplos .. please con "peritas y manzanas" xDD).

En resumen dispongo de N classes que extienden a la padre tipo:

Código PHP:
class PDF extends FPDF {

var 
$DisplayPreferences='';

function 
DisplayPreferences($preferences) {
    
$this->DisplayPreferences.=$preferences;
}

function 
_putcatalog()
{
    
parent::_putcatalog();
    if(
is_int(strpos($this->DisplayPreferences,'FullScreen')))
        
$this->_out('/PageMode /FullScreen');
    if(
$this->DisplayPreferences) {
        
$this->_out('/ViewerPreferences<<');
        if(
is_int(strpos($this->DisplayPreferences,'HideMenubar')))
            
$this->_out('/HideMenubar true');
        if(
is_int(strpos($this->DisplayPreferences,'HideToolbar')))
            
$this->_out('/HideToolbar true');
        if(
is_int(strpos($this->DisplayPreferences,'HideWindowUI')))
            
$this->_out('/HideWindowUI true');
        if(
is_int(strpos($this->DisplayPreferences,'DisplayDocTitle')))
            
$this->_out('/DisplayDocTitle true');
        if(
is_int(strpos($this->DisplayPreferences,'CenterWindow')))
            
$this->_out('/CenterWindow true');
        if(
is_int(strpos($this->DisplayPreferences,'FitWindow')))
            
$this->_out('/FitWindow true');
        
$this->_out('>>');
    }
}

y otra más por ejemplo ...
Código PHP:
class PDF_Javascript extends FPDF {

    var 
$javascript;
    var 
$n_js;

    function 
IncludeJS($script) {
        
$this->javascript=$script;
    }

    function 
_putjavascript() {
        
$this->_newobj();
        
$this->n_js=$this->n;
        
$this->_out('<<');
        
$this->_out('/Names [(EmbeddedJS) '.($this->n+1).' 0 R ]');
        
$this->_out('>>');
        
$this->_out('endobj');
        
$this->_newobj();
        
$this->_out('<<');
        
$this->_out('/S /JavaScript');
        
$this->_out('/JS '.$this->_textstring($this->javascript));
        
$this->_out('>>');
        
$this->_out('endobj');
    }

    function 
_putresources() {
        
parent::_putresources();
        if (!empty(
$this->javascript)) {
            
$this->_putjavascript();
        }
    }

    function 
_putcatalog() {
        
parent::_putcatalog();
        if (isset(
$this->javascript)) {
            
$this->_out('/Names <</JavaScript '.($this->n_js).' 0 R>>');
        }
    }

Instancio y uso el objeto (ahora uno sólo) tipo:
Código PHP:
$pdf=new PDF();
$pdf->SetDisplayMode('fullpage');
$pdf->DisplayPreferences('HideMenubar,HideToolbar,HideWindowUI');
$pdf->AddPage();
$pdf->SetFont('Arial','',16);
$pdf->Write(6,'Only the document should appear, no interface element.');
$pdf->Output(); 
Pero, .. claro .. si intento hacer eso con los dos . .pues alega PHP sobre duplicidad de classes (lógico) ..

He visto que algunas veces se extienden en "cadena" (el padre al hijo .. del hijo al nieto ... ) .. Podría servir .. pero realmente no son "padre ->hijo" sino todas son al padre (nuevos métodos). (tal vez aquí esté confundido .. esa es la impresión que me dá sin haber leido mucha teoría al respecto sobre modelos y temas afines).

Un salduo,