Newsgroup: it.comp.www.php
Titolo: Late binding esasperato...

Ciao a tutti,
  Il late binding, o collegamento dinamico, è quella caratteristica
tipica di alcuni linguaggi OO che consente il polimorfismo per
ereditarietà. Per esempio, nel C++, è possibile definire una classe B
derivata dalla classe A ed usare un puntatore a quest'ultima per
riferirsi ad istanze della prima:
<code>
  class A { /* ... */ };
  class B public A { /* ... */ }
  A *ptr;  // ptr può puntare indifferentemente ad istanze di A o di B
</code>
  Utilizzando la blanda tipizzazione del PHP 4.3.(0-4), si possono
ottenere, in questo contesto, utili risultati, anche se il codice
risulta piuttosto offuscato. Per esempio, volendo caricare a run-time
un driver (per qualsiasi cosa) senza modificare il codice chiamante, è
possibile fare una cosa del genere:
<code>
  // file: <driver>.php
  class <driver> {
    function do_something() { /* ... */ }
  }
  function create_<driver>() {
    return new <driver>;
  }
  // file: caller.php
  if (require_once "<driver>.php") {
    $my_driver =& call_user_func("create_<driver>");
    $my_driver->do_something();
  }
  else
    echo "Error: driver <driver> not installed.\n";
</code>
dove a <driver> potete sostituire l'identificatore del driver, a patto
di stilare uno standard di scrittura dei metodi delle varie classi
driver.
  Probabilmente ho scoperto l'acqua calda... ;-)
  Quello che mi chiedevo è se nei costrutti usati ci sono errori o
cose che potrebbero essere fatte meglio. Voi che ne dite? Grazie, e...
-- 
Alla prossima,
Marco

hai provato a costruire una classe che ti faccia da template?
un po' come le interface in java.
class a {
   function do_something(){
       print "do_something di a";
   }
}
class b extends a {
   function do_something(){
       print "do_something di b";
   }
}
così con un paio di file_exists puoi gestire tutto a runtime.  ;-)
"Ciò che vediamo ora non è che una pallida immagine 
 in  uno  specchio... ma presto il velo cadrà e noi 
 vedremo.." 
- Progetto 2501 -
-----------------------------------------
Messaggio inviato con Excite Newsgroup.
http://www.excite.it/newsgroup

 cosě con un paio di file_exists puoi gestire tutto a runtime.  ;-)
   Mi manca qualcosa...
   A me interessa poter istanziare una classe senza che il codice che la 
istanzia sappia o meno che, al momento della sua scrittura, esista: 
questo č il "succo" del collegamento dinamico. Il tuo suggerimento, in 
quest'ottica, non mi č molto chiaro: non posso, in PHP, istanziare "a" 
ed ottenere "b"; per lo meno, non mi viene in mente come potrei fare. ;-)
-- 
Alla prossima,
Marco

 ed ottenere "b"; per lo meno, non mi viene in mente come potrei fare. ;-)
C'e' una strada molto piu' semplice.
$classe = 'NomeClasse';
$oggetto = new $classe;
-- 
Roberto Lupi


Ciao,
sě ma in quel modo non sa se la definizione della classe esiste o meno (se
ho capito bene cosa vorrebbe ottenere)
<?php
class Ciccio{
function Ciccio(){}
function create_obj($name){
  $classDef= $name.'.php' ;
if(file_exists($classDef)){
include($classDef) ;
return new $name() ;
}
return false ;
}//end create_obj
} //END class
$x= new Ciccio() ;
//crea il nuovo oggetto
$y=$x->create_obj('altra_classe') or die('Definizione inesistente') ;
$y->metodo() ;
?>
In PHP5 c'č l'autoload
Forse sarebbe preferibile generare l'oggetto attraverso un metodo factory
previsto nella classe inclusa, riscrivendo il mtodo 'create_obj' in modo da
poter passare dei parametri di inizializzazione in modo flessibile
<?php
class Ciccio2{
function Ciccio(){}
function create_obj($name){
/*
il file con la definizione dela classe
*/
  $classDef= $name.'.php' ;
/*
Eventuali altri argomenti passati all costruttore,
togliamo il primo argomento che č il nome della classe
*/
$args= func_get_args() ;
array_shift($args) ;
/*
se il file che contiene la definizione della classe esiste
*/
if(file_exists($classDef)){
include($classDef) ;
/*
Chiama metodo factory
*/
return call_user_func_array(array($name, 'factory'), $args) ;
}
return false ;
}//end create_obj
} //END class
$x= new Ciccio2() ;
$y=$x->create_obj('altra_classe', 'arg1', 'arg2') or die('La definizione non
esiste') ;
$y->metodo() ;
?>
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

opps...c'erano delle sviste, corrette
<?php
class Ciccio2{
function Ciccio2(){}
function create_obj($name){
/*
il file con la definizione dela classe
*/
  $classDef= $name.'.php' ;
/*
Eventuali altri argomenti passati all costruttore,
togliamo il primo argomento che è il nome della classe
*/
$args= func_get_args() ;
array_shift($args) ;
/*
se il file che contiene la definizione della classe esiste
*/
if(file_exists($classDef)){
include($classDef) ;
return call_user_func_array(array($name, 'factory'), $args) ;
}
return false ;
}//end create_obj
} //END class
$x= new Ciccio2() ;
$y=$x->create_obj('altra_classe', 'arg1', 'arg2') or die('La def non
